How can I prepend and append to each member of an array?
For the record, with zsh
, there's the ${^array}
operator that turns on brace-like expansion on the elements of the array. So:
$ a=(one two three)
$ b=('foo '${^a}' bar')
$ printf '<%s>\n' $b
<foo one bar>
<foo two bar>
<foo three bar>
Search and replace also works in zsh
.
$ printf '<%s>\n' ${a//(#m)*/foo $MATCH bar}
<foo one bar>
<foo two bar>
<foo three bar>
As well as printf -v
on an array:
$ b=(); printf -v b 'foo %s bar' "$a[@]"
$ printf '<%s>\n' $b
<foo one bar>
<foo two bar>
<foo three bar>
Your echo ${CATEGORIES[@]/(.*)/foo \1 bar}
would work in ksh93
if written as:
$ printf '<%s>\n' "${CATEGORIES[@]/@(.*)/foo \1 bar}"
<foo one bar>
<foo two bar>
<foo three bar>
Depending on what your ultimate aim is, you could use printf
:
$ a=(1 2 3)
$ printf "foo %s bar\n" "${a[@]}"
foo 1 bar
foo 2 bar
foo 3 bar
printf
re-uses the format string until all the arguments are used up, so it provides an easy way to apply some formatting to a set of strings.
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[@]}")
Output:
[0] * "foo one bar $USER
[1] * "foo two bar $USER
[2] * "foo three bar $USER
[3] * "foo four bar $USER