Aqui está uma solução de caso especial que é adequada quando a string anexada (ou prefixada) é um caractere único , e você não precisa dos valores em uma nova matriz :
array=( aa bb cc )
IFS="]" # or, IFS="["
echo "${array[*]/#/ [}$IFS" # or, echo "$IFS${array[*]/%/] }
que produz saída [aa] [bb] [cc] .
- o formulário citado
"${array[*]}" adiciona o separador ] entre cada par (o primeiro caractere de IFS , é onde as restrições surgem)
-
${array[*]/#/ [} adiciona [ a cada elemento (ou /%/ forma a acrescentar)
- finalmente, adicione um
] (de IFS ) à direita para o valor expandido
Se essas etapas forem aplicadas uma a uma, você terá:
aa]bb]cc
[aa] [bb] [cc
[aa] [bb] [cc]
(Você também pode recuperar os dados trivialmente como uma nova matriz se os valores não contiverem espaço em branco.)
Você pode fazer as operações distintas de prefixo / postfix em um one-liner:
for ii in "${array[@]/#/foo }"; do echo "${ii/%/ bar}"; done
Esta é uma solução printf mais robusta que copia para uma nova matriz:
mapfile -d '' newarray < <(printf "foo %s bardeclare -a array newarray # -a for indexed array, -A for associative
array=( one two three )
for ii in "${!array[@]}"; do
printf -v "newarray[$ii]" "foo %s bar" "${array[$ii]}"
done
" "${array[@]}")
embora às custas de um subshell (bash-4.4 requerido para mapfile -d )
Finalmente, uma variação de loop que copia para uma nova matriz e também lida com matrizes esparsas e associativas, se necessário.
array=( aa bb cc )
newarray=( "${array[@]/*/foo & bar}" )
( printf não é necessário, você pode atribuir diretamente, mas é mais claro IMHO. bash não (ainda!) suporta impressão em uma matriz, mas zsh faz, dando-lhe uma cópia sem loop e transformar one-liner, veja a resposta de Stéphane acima.)
O que seria útil aqui é se bash suportasse o% comum& (como $MATCH in zsh ) como um marcador de lugar para a sequência combinada em expansões. O código está lá (e tem sido há muito tempo), mas infelizmente ainda não está ativado (veja shouldexp_replacement() em subst.c ). Se você ativá-lo (duas #if 0 alterações e recompilar), isso funciona como esperado:
compgen -P "foo " -S " bar" -W "${array[*]}"
Não importa, talvez esteja disponível na próxima versão ...
compgen tem uma operação de prefixo / sufixo (e suporta & , mas não de uma forma que possamos usar aqui). O melhor que podemos fazer com isso não é tão bom quanto a solução printf de um muru:
array=( aa bb cc )
IFS="]" # or, IFS="["
echo "${array[*]/#/ [}$IFS" # or, echo "$IFS${array[*]/%/] }
(note -W leva apenas uma única opção, então a matriz é nivelada, e isso causa problemas com valores com espaços ou qualquer coisa em IFS )