Substitua \ n por uma nova linha em sed portably

20
Estou tão confuso com o GNU sed , POSIX sed e BSD sed de inúmeras opções. Como substituo o literal \n pelo caractere de nova linha usando esses três sed tipos?

    
por Avinash Raj 04.07.2014 / 15:24

4 respostas

25

sed 's/\n/\
/g'

Observe a barra invertida imediatamente antes de atingir o retorno na string de substituição.

    
por 04.07.2014 / 15:41
8

Já que você já tem sua resposta portátil sed , apenas mencionarei que sed raramente é a melhor ferramenta se você precisar manipular de alguma forma as novas linhas. O Perl é quase tão portável quanto o sed , é instalado por padrão na maioria dos sistemas * nix e pode lidar com isso muito facilmente:

printf '%s\n' 'aa\nbb' | perl -pe 's/\n/\n/g'

Outra opção muito portátil é awk :

printf '%s\n' 'aa\nbb' | awk  '{gsub("\\n","\n")};1'

No Solaris, lembre-se de usar o awk padrão em / usr / xpg4 / bin, aquele em / bin é histórico e não deve ser usado para novos scripts.

    
por 04.07.2014 / 20:09
1

Se H oldspace estiver vazio, você também pode fazer:

sed '/\n/G;s/\n\(.*\)\(.\)//;P;D'

... mas a resposta do uxnut já é ao mesmo tempo mais rápida e mais simples, então você pode aceitá-la como você vai.

Outra possibilidade estranha:

INPUT | sed -n l | while read v ; do printf "${v%?}" ; done

Mas cuidado, ^ que traduz todos os escapes de barra invertida padrão\ no estilo C - como \b ackspace e \r eturn e %code% octals e whathaveyou.

    
por 05.08.2014 / 22:44
-2

Você precisa de uma solução em sed e isso já é fornecido abaixo. Mas eu queria acrescentar outra possibilidade de que a IMHO seja mais fácil e rápida,

tr -d "\n"
    
por 05.08.2014 / 22:56

Tags