2009-09-14 16 views
13

Saludos, ¿cómo realizo lo siguiente en BSD sed?¿Cómo uso un reemplazo de nueva línea en un BSD sed?

sed 's/ /\n/g' 

En la página-manual se indica que \ n se tratará literalmente con una cadena de reemplazo, ¿cómo puedo evitar este comportamiento? ¿Hay un alterno?

Estoy usando Mac OS Snow Leopard, puedo instalar fink para obtener GNU sed.

+1

Corrección pequeña: '\ n' no se trata literalmente como tal, se traduce literalmente a' n' (es decir, el '\' se descarta, pero obviamente ese no es el resultado deseado). – mklement0

Respuesta

14

En una cáscara, que puede hacer:

sed 's/ /\ 
/g' 

pulsando la tecla Intro después de la barra invertida para insertar un salto de línea.

+0

Fantástico, gracias Wooble. ¿Hay alguna razón conocida por la cual BSD sed no sea compatible con \ n en la cadena de reemplazo? Sólo curioso. –

+0

No estoy seguro, pero parece que decidieron no admitir escapes en absoluto en la cadena de reemplazo. sed 'y// \ n /' parece funcionar, aunque solo reemplaza cadenas; si necesita reemplazar el '' con una expresión regular, fallará. Además, el \ n parece ser especial; con obtener una 'r', no un retorno de carro. – geoffspear

6

Otra forma:

sed -e 's/ /\'$'\n/g' 

Ver here.

+2

+1, pero tenga en cuenta que esto se basa en una función de shell, [CITA ANSI C] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) ('$ '... .''), y algunos shells no lo admiten (por ejemplo, 'dash' - no es parte de POSIX). Además, ''s// \' $ '\ n' '/ g'' - encajando un' $' \ n'' entre dos cadenas de comillas simples - es conceptualmente más claro y más robusto. Alternativamente, use '$ 's// \\\ n/g'' (tenga en cuenta la necesidad de escapar de' \ '). – mklement0

4

Para facilitar su uso, yo personalmente utilizo a menudo

cr="\n" 
# or (depending version and OS) 
cr=" 
" 

sed "s/ /\\${cr}/g" 

para que se mantenga en 1 línea.

+1

Interesante; ¿Puedo sugerir llamar a la variable 'nl' en lugar de' cr'? Suponiendo que utiliza un shell que admite [COTACIÓN ANSI C] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) (por ejemplo, 'bash',' ksh', 'zsh '), podría simplificar la asignación a' cr = $ '\ n''; entonces no tendrías que preocuparte por las diferencias de plataforma. – mklement0

+0

consejo genial, sur sobre el '$ '\ n'' en cualquier" Unix "? en verdad ayudará (mi Sun me da algún problema en la asignación/acción de esa manera con '\ n') – NeronLeVelu

+1

' $ '\ n'' (cita de ANSI-C) debería funcionar si tiene el _shell_ correcto ('bash', 'ksh', o' zsh' - NO en las funciones POSIX-solo las shells como 'dash', sin embargo), por lo que la plataforma no debería importar. ('bash' introdujo la función en la versión 2.0 (hace mucho tiempo) - no estoy seguro de' ksh', y 'zsh', pero esperaría que los sistemas actuales tuvieran versiones lo suficientemente recientes). – mklement0

Cuestiones relacionadas