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 "\" .
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?
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 "\" .
A solução mais curta parece ser com perl:
perl -pe 's/\\n//'
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.
Você pode usar awk
:
$ awk 'sub(/\$/,""){printf("%s", $0);next};1' file
"abc def xyz pqr"
Outra awk
variação
awk '{ORS = /\/? "": RS; sub(/\$/, ""); print}' file
Tags text-processing sed newlines