Estou tão confuso com a infinidade de opções do GNU sed
, POSIX sed
e BSD sed
. Como substituo literal \n
pelo caractere de nova linha usando esses três sed
tipos?
foo\\nbar
ou foo\\\nbar
?
Estou tão confuso com a infinidade de opções do GNU sed
, POSIX sed
e BSD sed
. Como substituo literal \n
pelo caractere de nova linha usando esses três sed
tipos?
foo\\nbar
ou foo\\\nbar
?
Respostas:
sed 's/\\n/\
/g'
Observe a barra invertida imediatamente antes de retornar na string de substituição.
sed
comando original no Unix v7 em 1979. O único lugar em que isso pode não funcionar seria implementações despojadas que não sejam POSIX, sed
como algumas baseadas no busybox despojado. Isso não funcionará no csh, mas é um problema do csh.
\\n
é usado na parte de pesquisa, por que não usar \n
na substituição? o primeiro parece implicar que o último existe. ie Por que não isso$ echo '1\n2'|sed 's/\\n/\n/g'
\n
é um literal, implicando que ele aparece como os dois caracteres: abackslash seguido por n
e não como um único caractere de nova linha. Assim, duas barras para fazer a barra invertida um literal e, em seguida,n
Como você já tem sua sed
resposta portátil , mencionarei que sed
raramente é a melhor ferramenta se você precisar manipular novas linhas. O Perl é quase tão portátil quanto sed
, é instalado por padrão na maioria dos sistemas * nix e pode lidar com isso com muita facilidade:
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, o do / bin é histórico e não deve ser usado para novos scripts.
awk
tem problemas de portabilidade semelhantes (É o meu awk
velho liso awk
, nawk
ou gawk
?). Na verdade, a versão nas minhas caixas Solaris não existe gsub()
. Meu voto aqui é para Perl ( perl -nlawe '...'
aproxima o comportamento automático de awk
).
awk
portabilidade, awk
use uma versão compatível com POSIX e use apenas esses recursos, e você deve estar bem. No Solaris, você encontrará um como /usr/xpg4/bin/awk
.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
deve funcionar em quase todos os lugares. Até o busybox tem um awk
.
Se o espaço H
antigo estiver vazio, você também poderá:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... mas a resposta da uxnut já é mais rápida e mais simples, para que você possa tomá-la como quiser.
Outra possibilidade estranha:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Mas cuidado, ^ que traduz todas as \
escapes de barra invertida padrão do estilo C - como \b
espaço de trabalho e \r
eturn e \00
octais e o que você quiser.
Com gnu sed
o seguinte também funciona:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Você precisa de uma solução no sed, e isso já é fornecido abaixo. Mas eu queria acrescentar outra possibilidade de que o IMHO seja mais fácil e rápido,
tr -d "\n"