“绑定”Bash 大括号

“绑定”Bash 大括号

在巴什中,

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"; }

相关内容