在巴什中,
echo a{b,c}d{e,f}
印刷
abde abdf acde acdf
我想看到的输出是
abde acdf
换句话说,给定氮参数,我希望 Bash 使用我要构造的每对大括号内的第一个参数氮字符串。
答案1
我会用数组来做到这一点:
$ foo=( b c ); bar=( e f ); for i in {0..1}; do echo a${foo[$i]}d${bar[$i]}; done
abde
acdf
我假设您的实际用例有点复杂,因此如果您使用另一个命令填充数组并且不一定知道它们的大小,您可以使用:
foo=( b c ); bar=( e f ); for i in $(seq 0 $((${#foo[@]}-1))); do
echo a${foo[$i]}d${bar[$i]};
done
答案2
这是一个愚蠢的答案,但无论如何:
$ echo a{b,c,d}e{f,g,h} | awk 'BEGIN {N=3;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'
$ echo a{b,c,d,1}e{f,g,h,2} | awk 'BEGIN {N=4;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'
$ echo a{b,c,d,1,A}e{f,g,h,2,Z} | awk 'BEGIN {N=5;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'
答案3
您无法改变牙套的工作方式。
如果文本中没有出现一个字符串,例如,
,您可以对数组应用连续的字符串替换:
a=(,b,e @c,f)
a=("${a[@]/,/a/}")
a=("${a[@]/,/d}")
echo "${a[@]}"
不过,循环会更清晰。如果你想将各个部分粘在一起,你可以使用一个不会出现在字符串中的分隔符,比如说,
在大括号内无论如何都是特殊的。
a=(); IFS=,; set -f
for x in b,e c,f; do
a+=(a${x%*,}d${x#*,})
done
另一种方法是定义两个并行数组。
version=(test main)
files=(AppTest.java App.java)
for ((i=0; i<${#files}; i++) rm "src/$version[i]/java/org/sonatype/mavenbook/files[i].java"
我认为处理这个特定命令的最简单方法是定义一个函数。
rmapp () { rm "src/$1/java/org/sonatype/mavenbook/$2.java"; }