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)
根据您的最终目标是什么,您可以使用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 重新使用格式字符串,直到所有参数都用完,因此它提供了一种将某些格式应用于一组字符串的简单方法。
作为记录,使用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)
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)