Reemplazar \ n por una nueva línea en sed portátil
23
Estoy tan confundido con GNU sed, POSIX sedy sedla gran cantidad de opciones de BSD . ¿Cómo reemplazo literal \ncon el carácter de nueva línea usando estos tres sedtipos?
Creo que debería; Probé solo en Linux usando la versión gnu.
unxnut
11
@AvinashRaj. Eso es POSIX y funcionó con el sedcomando original en Unix v7 en 1979. El único lugar donde eso podría no funcionar sería implementaciones no POSIX despojadas, sedcomo algunas despojadas basadas en busybox. Eso no funcionará en csh pero es un problema de csh.
Stéphane Chazelas
Como \\nse usa en la parte de búsqueda, ¿por qué no usar \nen el reemplazo? lo primero parece implicar que lo último existe. es decir. ¿Por qué no esto$ echo '1\n2'|sed 's/\\n/\n/g'
En este caso, \nes 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
unxnut
9
Como ya tiene su sedrespuesta portátil , solo mencionaré que sedrara 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:
Yo diría que awktiene problemas de portabilidad similares (¿Es mi awkviejo awk, nawko 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).
arielCo
2
@arielCo: para la awkportabilidad, quédese con una versión awkque sea compatible con POSIX y solo use esas funciones y debería estar bien. En Solaris encontrará uno como /usr/xpg4/bin/awk.
@arielCo en realidad, awk es más portátil que perl. Mi segundo enfoque awk que no usa gsub()debería funcionar en casi todas partes. Incluso busybox tiene un awk.
terdon
1
gsub () es POSIX (gsub, se agregó en SVR3.1, POSIX awk se basa en SVR4 con algunas adiciones; consulte el manual de gawk para obtener más información), gensub () es la extensión GNU. El awk original todavía se encontraba como / bin / awk en Solaris, no admitía el soporte gsub (), pero tampoco admitía un FS de caracteres múltiples.
Stéphane Chazelas
1
Si Holdspace 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 \backspace y \return \00y octals y lo que sea que tenga.
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,
foo\\nbar
ofoo\\\nbar
?Respuestas:
Observe la barra invertida justo antes de presionar la tecla de retorno en la cadena de reemplazo.
fuente
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 den
, 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é quesed
rara vez es la mejor herramienta si necesita manipular nuevas líneas. Perl es casi tan portátil comosed
, está instalado de forma predeterminada en la mayoría de los sistemas * nix y puede manejar esto muy fácilmente:Otra opción muy portátil es
awk
: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.
fuente
awk
tiene problemas de portabilidad similares (¿Es miawk
viejoawk
,nawk
ogawk
?). En realidad, la versión en mis cajas de Solaris carecegsub()
. Mi voto aquí es por Perl (seperl -nlawe '...'
aproxima al comportamiento automático deawk
).awk
portabilidad, quédese con una versiónawk
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 unawk
.Si
H
oldspace está vacío, también puede hacer:... 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:
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.fuente
Con
gnu sed
lo siguiente también funciona:fuente
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,
fuente