Estou tão confuso com a infinidade de opções do GNU sed, POSIX sede BSD sed. Como substituo literal \npelo caractere de nova linha usando esses três sedtipos?
foo\\nbarou foo\\\nbar?
Estou tão confuso com a infinidade de opções do GNU sed, POSIX sede BSD sed. Como substituo literal \npelo caractere de nova linha usando esses três sedtipos?
foo\\nbarou foo\\\nbar?
Respostas:
sed 's/\\n/\
/g'
Observe a barra invertida imediatamente antes de retornar na string de substituição.
sedcomando 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, sedcomo 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 \nna 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 ne 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 sedresposta portátil , mencionarei que sedraramente é 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.
awktem problemas de portabilidade semelhantes (É o meu awkvelho liso awk, nawkou 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).
awkportabilidade, awkuse 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 Hantigo 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 \bespaço de trabalho e \return e \00octais e o que você quiser.
Com gnu sedo 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"