Tudo o que você precisa fazer é o seguinte:
-
Defina a variável. Nós vamos usar isso:
var="kijhg, fbjhku,,,ioy fbjfr, kjmyhg"
-
Defina o
$IFS
e evite a expansão do nome do arquivo:IFS=, ; set -f
-
set
shell$@
array para a saída.set -- $var
-
Redefinir o shell pai
$IFS
e os parâmetros do shell:unset IFS ; set +f
-
Hooray! Até preserva várias repetições e espaços e tudo!
printf %s\n "$@"
OUTPUT
kijhg fbjhku ioy fbjfr kjmyhg
De qualquer forma, aceite minha palavra. Todos os caracteres que não são ,
são preservados.
TRANSFORMAR
Eu recomendo especialmente usar o array de shell real em oposição ao array bash porque você pode transformar instantaneamente seu splitter.
printf %s "$*"
#OUTPUT#
kijhg fbjhku ioy fbjfr kjmyhg %
IFS=, ; printf %s "$*"
#OUTPUT#
kijhg, fbjhku,,,ioy fbjfr, kjmyhg
Como $*
tem a qualidade especial especificada pelo POSIX de dividir a matriz de argumentos do parâmetro posicional do shell no primeiro caractere de $IFS
, é possível converter facilmente faixas de dados de maneira simples. Você pode "quote"
-proteger a matriz de argumentos e ainda dividi-la em qualquer caractere único que desejar. Contanto que você acerte da primeira vez, isto é.
APPEND / PREPEND
POSIX também especifica qualidades especiais para "$@"
. Além dos formulários de endereçamento "$1"... eval "\${$#}"
para cada argumento, o parâmetro "$@"
- quando citado - é expandido com segurança para todos os argumentos do shell, já que eram set
, independentemente do valor atual de $IFS.
Então, se você quiser adicione uma lista ao começo da sua matriz que você faz:
set -- $list "$@"
Para a cabeça / cauda:
set -- $head "$@" $tail
Para triplicar sua matriz:
set -- "$@" "$@" "$@"
TOTALMENTE AGORA
A menos que seu fluxo de dados seja muito grande, o seguinte pode ser um pouco mais rápido do que sua operação atual (embora, se você estiver trabalhando com arquivos, seria muito melhor evitar totalmente a divisão de shell) :
( set -f -- ; IFS=, ; while read -r line ; do set -- "$@" $line ; done
printf %s "$*" ) | cat >out
TALVEZ TR?
O que eu não entendo é isso - o que você está fazendo? Você está tentando substituir novas linhas por vírgulas? Quero dizer - os dados já estão separados por vírgulas, exceto apenas as novas linhas? Se assim for:
tr '\n' ',' <in >out