Remover barra invertida + sequências de nova linha [duplicado]

6

Estamos tendo um arquivo no Linux que contém uma linha por registro, mas o problema ocorre quando a linha contém alguns novos caracteres de linha. Nesse caso, a barra invertida é anexada no final da linha e o registro é dividido em várias linhas. Então, abaixo está o meu problema:

"abc def \
xyz pqr"

deve ser:

"abc def xyz pqr"

Eu tentei sed -I 's/\\n/ /g' <file_name> , o que não está funcionando. Eu também tentei o comando tr mas ele substitui apenas um caractere, não a string. Você pode sugerir qualquer comando para lidar com esse problema?

    
por Deepak 27.07.2014 / 22:08

5 respostas

7

Você deve poder usar

sed -e :a -e '/\$/N; s/\\n//; ta'

Veja Famous One-Liners Explained, de Peter Krumins, Parte I , 39. Anexe uma linha à próxima se ela terminar com uma barra invertida "\" .

    
por 27.07.2014 / 22:39
2

A solução mais curta parece ser com perl:

perl -pe 's/\\n//'
    
por 27.07.2014 / 22:55
2
while read twolines
do printf %s\n "$twolines"
done <file

... que é o que eu suspeito que era o destino pretendido para esse arquivo de qualquer maneira. Com sed , você pode fazer:

sed 'N;s/\([^\]\)\\n//;P;D' <file

... o que pelo menos protegeria aspas citadas, embora perca as barras invertidas citadas por barras invertidas. Sim, é uma espécie de pesadelo regex-wise, mas a coisa while read...done lida com todos esses casos corretamente. É certo que, com alguma adaptação, a solução da steeldriver também poderia lidar com todos os casos de forma confiável, porque o comando t pode reciclar uma vez por substituição bem-sucedida.

Ainda assim, se isso não for um problema, então:

sed 'N;s/\\n//;P;D' <file

... faz o trabalho.

    
por 28.07.2014 / 00:24
2

Você pode usar awk :

$ awk 'sub(/\$/,""){printf("%s", $0);next};1' file
"abc def xyz pqr"
    
por 28.07.2014 / 03:44
1

Outra awk variação

awk '{ORS = /\/? "": RS; sub(/\$/, ""); print}' file
    
por 28.07.2014 / 14:15