如何在数组的每个成员之前添加和附加?

Big*_*uge 9 bash array string shell-script

我有一个数组:

CATEGORIES=(one two three four)
Run Code Online (Sandbox Code Playgroud)

我可以使用参数扩展添加到每个数组成员:

echo ${CATEGORIES[@]/#/foo }
Run Code Online (Sandbox Code Playgroud)

我可以以相同的方式附加到每个数组成员:

echo ${CATEGORIES[@]/%/ bar}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这两点?这些都不起作用:

echo ${CATEGORIES[@]/(.*)/foo \1 bar}
echo ${CATEGORIES[@]/(.*)/foo $1 bar}
echo ${CATEGORIES[@]/(.*)/foo ${BASH_REMATCH[1]} bar}
Run Code Online (Sandbox Code Playgroud)

mur*_*uru 9

根据您的最终目标是什么,您可以使用printf

$ a=(1 2 3)
$ printf "foo %s bar\n" "${a[@]}"
foo 1 bar
foo 2 bar
foo 3 bar
Run Code Online (Sandbox Code Playgroud)

printf 重新使用格式字符串,直到所有参数都用完,因此它提供了一种将某些格式应用于一组字符串的简单方法。


Sté*_*las 9

作为记录,使用zsh,有一个${^array}运算符可以在数组元素上打开类似大括号的扩展。所以:

$ a=(one two three)
$ b=('foo '${^a}' bar')
$ printf '<%s>\n' $b
<foo one bar>
<foo two bar>
<foo three bar>
Run Code Online (Sandbox Code Playgroud)

搜索和替换也适用于zsh.

$ printf '<%s>\n' ${a//(#m)*/foo $MATCH bar}
<foo one bar>
<foo two bar>
<foo three bar>
Run Code Online (Sandbox Code Playgroud)

以及printf -v在数组上:

$ b=(); printf -v b 'foo %s bar' "$a[@]"
$ printf '<%s>\n' $b
<foo one bar>
<foo two bar>
<foo three bar>
Run Code Online (Sandbox Code Playgroud)

echo ${CATEGORIES[@]/(.*)/foo \1 bar}将工作中ksh93,如果写为:

$ printf '<%s>\n' "${CATEGORIES[@]/@(.*)/foo \1 bar}"
<foo one bar>
<foo two bar>
<foo three bar>
Run Code Online (Sandbox Code Playgroud)


Pet*_*r.O 6

p='* "foo  '
s='  bar $USER' 
CATEGORIES=(one two three four)
CATEGORIES=("${CATEGORIES[@]/#/$p}")
CATEGORIES=("${CATEGORIES[@]/%/$s}")

paste <(printf '[%s]\n' "${!CATEGORIES[@]}") \
      <(printf '%s\n'    "${CATEGORIES[@]}")
Run Code Online (Sandbox Code Playgroud)

输出:

[0] * "foo  one  bar $USER
[1] * "foo  two  bar $USER
[2] * "foo  three  bar $USER
[3] * "foo  four  bar $USER
Run Code Online (Sandbox Code Playgroud)