Substitua a vírgula pela nova linha seguinte por apenas um comando e espaço

0

Eu tenho uma lista assim.

blue-image1.jpg,
blue-image2.jpg,
blue-image3.jpg
red-image1.jpg,
red-image2.jpg,
red-image3.jpg

Ele era originalmente um formato csv, mas eu adicionei novas linhas porque eles precisavam de um prefixo no começo. Agora eu preciso colocá-los juntos novamente, assim fica assim.

blue-image1.jpg,blue-image2.jpg,blue-image3.jpg
red-image1.jpg,red-image2.jpg,red-image3.jpg

Eu tentei cat list.txt | tr ',\n' ',' e cat list.txt | sed 's/,\n/,/g'

mas nenhum parece funcionar corretamente.

    
por johnny538 11.12.2016 / 16:53

8 respostas

3

Concedo que esta próxima resposta é tecnicamente menos eficiente do que apenas uma única chamada para sed , mas estou adicionando ao mix porque é muito mais fácil de lembrar, escrever, ler, entender e modificar do que os outros:

cat list.txt | tr ',\n' '#@' | sed 's/#@/,/g;s/@/\n/g'
    
por 14.02.2018 / 23:56
3

Simplesmente tão fácil quanto:

$ sed -z 's/,\n/,/g' infile
blue-image1.jpg,blue-image2.jpg,blue-image3.jpg
red-image1.jpg,red-image2.jpg,red-image3.jpg

A opção -z define o separador de registro de entrada como NUL , evitando problemas com \n . Veja man sed :

-z, --null-data
separate lines by NUL characters

    
por 19.04.2018 / 07:17
1

Isso é essencialmente o mesmo que 39. Anexe uma linha à próxima se ela terminar com uma barra invertida "\". de Peteris Krumins ' One-Liners Explained Sed, Parte I: Espaçamento de Arquivo, Numeração e Conversão de Texto e Substituição , mas com uma vírgula no lugar de uma barra invertida como o caractere de continuação, ou seja,

sed -e :a -e '/,$/N; s/,\n/,/; ta' list.txt
blue-image1.jpg,blue-image2.jpg,blue-image3.jpg
red-image1.jpg,red-image2.jpg,red-image3.jpg
    
por 11.12.2016 / 17:02
1

cat list.txt | sed ':a;N;$!ba;s/,\n/,/g'

saída:

blue-image1.jpg,blue-image2.jpg,blue-image3.jpg
red-image1.jpg,red-image2.jpg,red-image3.jpg
    
por 11.12.2016 / 17:02
0
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' yourfile
    
por 11.12.2016 / 17:01
0

Eu tenho abaixo de um liner para alcançar o mesmo. Como testado, funcionou bem

inputfile

blue-image1.jpg,
blue-image2.jpg,
blue-image3.jpg
red-image1.jpg,
red-image2.jpg,
red-image3.jpg

comando

sed -n '/^blue/p' inputfile | perl -pne "s/\n//g";echo ""; sed -n '/red/p' p.txt  | perl -pne "s/\n//g"

saída

blue-image1.jpg,blue-image2.jpg,blue-image3.jpg
red-image1.jpg,red-image2.jpg,red-image3.jpg
    
por 15.01.2018 / 09:40
0

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

    
por 19.04.2018 / 02:10
-1

você pode usar o comando paste:

paste -s -d " " list.txt | sed -e 's/[a-z]\ /g\n/g'

blue-image1.jpg, blue-image2.jpg, blue-image3.jpg red-image1.jpg, red-image2.jpg, red-image3.jpg

    
por 19.04.2018 / 06:33