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?

DᴀʀᴛʜVᴀᴅᴇʀ
fuente
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?

Radu Rădeanu
fuente
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
Bienvenido a Stack Exchange. Este sitio está editado en colaboración. Si no se siente cómodo con la idea de que sus contribuciones sean editadas en colaboración por otros usuarios confiables, este puede no ser el sitio para usted. Noté que su código reemplazado más de la frase específica que se pretende, por lo edité en la frase.
Gilles parada SO ser maligno '
@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.

Gilles 'SO- deja de ser malvado'
fuente
@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
0

sed no puede leer fácilmente en varias líneas. Usar en su perl -i -0pe 's/.../.../...'lugar.

Que hacer
fuente
77
¡sed puede leer en varias líneas!
Radu Rădeanu
3
@ RaduRădeanu Técnicamente, sí. Pero rara vez vale la pena.
Gilles 'SO- deja de ser malvado'
3
@Gilles Si usarlo perles más simple para usted, esto no significa que sedrara vez valga la pena.
Radu Rădeanu