Sed sustituye a través de una oración en varias líneas


11

Soy nuevo en el uso de sed, pero he estado experimentando sed s/..../..../(sustituto) para modificar una oración completa si está en una línea, pero no conozco una solución alternativa sobre cómo modificar una oración que puede haberse separado en dos líneas como:

Esta:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

en realidad se escribe así:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

¿Cómo puede detectar esto o codificarlo para reemplazar la oración completa, incluso si está en dos líneas en lugar de una?


Great sed reference book: Definitive Guide to sed Tutorial and Reference por Daniel A. Goldman ISBN: 978-1-939824-01-1 (versión EPUB) 08148804441822
Joe

Respuestas:


16

El siguiente comando funcionará en ambas situaciones:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Más explicaciones: ¿Cómo puedo usar sed para reemplazar una cadena de varias líneas?


3
@Gilles Entiendo tus buenas intenciones, pero intenta probar antes de estropear mi respuesta. Mejor, si tiene otra opinión, es agregar otra respuesta o dejar un comentario.
Radu Rădeanu


@Gilles Por favor, no necesitas ser travieso. También debería notar que su "código" no reemplazó absolutamente nada . Como dije, entiendo tus buenas intenciones. Desde mi ejemplo, supongo que el OP para entender cómo sustituir a través de una oración en varias líneas con sed, nada más. Y esta es la pregunta del título. El título no se trata perl.
Radu Rădeanu

No, el código que publiqué funciona. (Excepto si Loremestá en la última línea, un defecto que comparte con su versión.)
Gilles 'SO siendo parada del mal'

Este ejemplo no funciona cuando hay 3 o más líneas de texto :(
artnikpro

12

Si bien sed puede hacer coincidir patrones en varias líneas (usando los comandos No Hpara agregar líneas sucesivas antes de hacer coincidir), esto está muy fuera de su zona de confort. Intenta hacerlo solo si te gusta el dolor.

Perl puede hacer este tipo de cosas muy bien. Use el -pinterruptor para que procese la entrada estándar de un registro a la vez e imprima el registro modificado (al estilo sed), y -000active el modo de párrafo (donde los registros están separados por líneas en blanco). En una expresión regular, \scoincide con cualquier carácter de espacio en blanco, incluida una nueva línea.

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

Si desea poner una nueva línea en el texto de reemplazo cuando el original contiene una, eso es más complicado. Cómo hacerlo depende de sus requisitos en cuanto a dónde colocar la nueva línea.


@terdon Ah, quise permitir múltiples espacios en blanco, pero lo olvidé. Gracias, arreglado.
Gilles 'SO- deja de ser malvado'

La pregunta es sobre sed. También está etiquetado con sed, no con perl.
Radu Rădeanu

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.