我希望在Bash中类似于花括号扩展一样,在数组前缀和后缀加上内容。
假设我有一个Bash数组:
ARRAY=( one two three )
我希望能够像以下花括号扩展那样,在前缀和后缀处进行操作
echo prefix_{one,two,three}_suffix
我能找到的最好方法是使用Bash正则表达式,可以添加前缀或后缀。
echo ${ARRAY[@]/#/prefix_}
echo ${ARRAY[@]/%/_suffix}
但我找不到如何同时执行这两个操作的任何信息。可能我可以使用正则表达式捕获并执行类似以下的操作:
但我无法以同时执行这两个操作的方式找到任何信息。有可能我可以使用正则表达式捕获,然后执行类似以下的操作:
echo ${ARRAY[@]/.*/prefix_$1_suffix}
但似乎bash变量的正则表达式替换不支持捕获,我也可以像这样存储一个临时的数组变量PRE=(${ARRAY[@]/#/prefix_})
echo ${PRE[@]/%/_suffix}
这可能是我能想到的最好的方法,但它仍然似乎不够好。最后一个替代方案是使用类似于for循环的方法。
EXPANDED=""
for E in ${ARRAY[@]}; do
EXPANDED="prefix_${E}_suffix $EXPANDED"
done
echo $EXPANDED
但那样看起来太丑了。而且我不知道如果我想在前缀、后缀或数组元素中任何地方添加空格,该怎么做才能让它正常工作。
declare -p array
。当运行后缀命令时,它只会将其添加到列表中的最后一个项目中。 - MagneIFS='' ARRAY=(p $'\nq' 'r s'); ARR_PRE=("${ARRAY[@]/#/prefix_}"); ARR_POS=("${ARR_PRE[@]/%/_suffix}"); declare -p ARR_POS
。甚至printf也不会出问题。 - Mingye WangIFS=$'\n'
,你就会明白我的意思。它输出:declare -a ARR_POS='([0]="prefix_p prefix_q prefix_r s_suffix")'
- Magne\r
、\t
、\f
甚至\a
时也会出现问题。这在 bash 3.2.57(1) (Apple) 上发生,但在 5.0.17(1) 上却没有。我认为这是一个旧的 bash bug,你刚好碰上了... - Mingye Wang