Solução:
perl -lape '$\=/,/?"":"\n"' list.txt
Explicação:
Define o separador de registro de saída $\
para a string vazia ""
se uma linha contiver uma vírgula; redefine para \n
caso contrário (o separador de registro de saída é o que separa as linhas uma da outra na saída; no Unix, normalmente é uma nova linha). Equivalente ao mais longo e mais fácil de ler:
perl -lape '(/,/) ? ($\="") : ($\="\n")' list.txt
ou, da mesma forma:
perl -lape 'if (/,/) {$\=""} else {$\="\n"}' list.txt
Comentários:
O motivo sed
não faz o que o OP esperava é que ele retire o separador de registro antes de trabalhar na linha e o coloque novamente depois. O separador de registro sendo "\n"
por padrão, nenhum "\n"
é encontrado para a substituição. Eu escolhi perl
porque eu sei que o separador de registro é exposto como uma variável especial que pode ser explicitamente manipulada.
Minha solução é baseada na amostra de entrada postada e na saída desejada. Eu não acho que isso responda a pergunta no título: Substitua vírgula por nova linha seguindo com apenas um comando e espaço . Eu li isso muitas vezes, mas essas palavras simplesmente não formam uma sequência significativa para mim.
Editar - solução mais fácil:
perl -pe 's/,\n/,/' list.txt
Isso é o que eu sugeri nos comentários e pensei em adicioná-lo à resposta. Embora seja curto e imediato, qual é a graça de usar perl
se você não conseguir mostrar uma variável especial pouco conhecida e uma sintaxe obscura? ;-P