
Estou tentando usar a substituição de string para combinar um array. Saída:
a,b,c
O procedimento abaixo funciona, mas não há como fazer isso sem tubulação?
#!/bin/bash
words=(a b c)
echo "${words[@]}" | sed 's/ /,/g'
Eu tentei isso, o que não funciona.
echo "${words[@]// /,/}"
Responder1
Se você deseja gerar uma string que consiste nos elementos de uma matriz delimitada por um caractere específico, use
words=(a b c)
( IFS=,; printf '%s\n' "${words[*]}" )
Usar *
no lugar de @
in "${words[*]}"
criará uma única string a partir da concatenação de todos os elementos do array words
. Os elementos serão delimitados pelo primeiro caractere $IFS
, por isso colocamos uma vírgula antes de fazer a expansão.
Eu configurei IFS
um subshell para evitar configurá-lo inadvertidamente para qualquer outra operação além da expansão única necessária para criar a string delimitada por vírgula para a printf
chamada.
Em vez de usar um subshell para definir IFS
localmente, você pode configurá-lo e redefini-lo:
words=(a b c)
IFS=,$IFS
printf '%s\n' "${words[*]}"
IFS=${IFS#?}
Isso primeiro adiciona uma vírgula como o primeiro caractere de $IFS
, mantendo o valor antigo da variável como os caracteres após a vírgula.
A substituição do parâmetro ${IFS#?}
excluiria o primeiro caractere (a vírgula que adicionamos).