Estoy tan confundido con GNU sed
, POSIX sed
y sed
la gran cantidad de opciones de BSD . ¿Cómo reemplazo literal \n
con el carácter de nueva línea usando estos tres sed
tipos?
foo\\nbar
o foo\\\nbar
?
Estoy tan confundido con GNU sed
, POSIX sed
y sed
la gran cantidad de opciones de BSD . ¿Cómo reemplazo literal \n
con el carácter de nueva línea usando estos tres sed
tipos?
foo\\nbar
o foo\\\nbar
?
Respuestas:
sed 's/\\n/\
/g'
Observe la barra invertida justo antes de presionar la tecla de retorno en la cadena de reemplazo.
sed
comando original en Unix v7 en 1979. El único lugar donde eso podría no funcionar sería implementaciones no POSIX despojadas, sed
como algunas despojadas basadas en busybox. Eso no funcionará en csh pero es un problema de csh.
\\n
se usa en la parte de búsqueda, ¿por qué no usar \n
en el reemplazo? lo primero parece implicar que lo último existe. es decir. ¿Por qué no esto$ echo '1\n2'|sed 's/\\n/\n/g'
\n
es un literal, lo que implica que aparece como los dos caracteres: una barra diagonal inversa seguida de n
, y no como un solo carácter de nueva línea. Por lo tanto, dos barras invertidas para hacer backslash un literal y luegon
Como ya tiene su sed
respuesta portátil , solo mencionaré que sed
rara vez es la mejor herramienta si necesita manipular nuevas líneas. Perl es casi tan portátil como sed
, está instalado de forma predeterminada en la mayoría de los sistemas * nix y puede manejar esto muy fácilmente:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
Otra opción muy portátil es awk
:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
En Solaris, recuerde usar el awk estándar en / usr / xpg4 / bin, el que está en / bin es histórico y no debe usarse para nuevos scripts.
awk
tiene problemas de portabilidad similares (¿Es mi awk
viejo awk
, nawk
o gawk
?). En realidad, la versión en mis cajas de Solaris carece gsub()
. Mi voto aquí es por Perl (se perl -nlawe '...'
aproxima al comportamiento automático de awk
).
awk
portabilidad, quédese con una versión awk
que sea compatible con POSIX y solo use esas funciones y debería estar bien. En Solaris encontrará uno como /usr/xpg4/bin/awk
.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
debería funcionar en casi todas partes. Incluso busybox tiene un awk
.
Si H
oldspace está vacío, también puede hacer:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... pero la respuesta de uxnut ya es más rápida y más simple, por lo que puedes tomarla como quieras.
Otra posibilidad extraña:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Pero tenga cuidado, ^ eso traduce todos los \
escapes de barra invertida de estilo C estándar , como \b
ackspace y \r
eturn \00
y octals y lo que sea que tenga.
Con gnu sed
lo siguiente también funciona:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Necesita una solución en sed, y eso ya se proporciona a continuación. Pero quería agregar otra posibilidad de que, en mi humilde opinión, es más fácil y rápido,
tr -d "\n"