Sed sostituisce una frase su più righe


11

Sono nuovo nell'uso di sed ma ho sperimentato sed s/..../..../(sostituto) per modificare una frase completa se è su una riga ma non sono a conoscenza di una soluzione alternativa su come modificare una frase che potrebbe essere stata separata su due righe come:

Questo:

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

è in realtà scritto come questo:

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

Come puoi rilevare questo o codificarlo per sostituire l'intera frase anche se si trova su due righe anziché su una?


Grande libro di consultazione su sed: Guida definitiva a sed Tutorial e riferimento di Daniel A. Goldman ISBN: 978-1-939824-01-1 (versione EPUB) 08148804441822
Joe

Risposte:


16

Il seguente comando funzionerà in entrambe le situazioni:

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

Altre spiegazioni: come posso usare sed per sostituire una stringa multilinea?


3
@Gilles Capisco le tue buone intenzioni, ma per favore prova a provare prima di sbagliare la mia risposta. Meglio, se hai un'altra opinione, è aggiungere un'altra risposta o lasciare un commento.
Radu Rădeanu,


@Gilles Per favore, non devi essere malizioso. Dovresti anche notare che il tuo "codice" non ha sostituito assolutamente nulla . Come ho detto, capisco le tue buone intenzioni. Dal mio esempio suppongo che l'OP per capire come sostituire una frase su più righe con sed, niente di più. E questa è la domanda del titolo. Il titolo non riguarda perl.
Radu Rădeanu,

No, il codice che ho pubblicato funziona. (Tranne se si Loremtrova sull'ultima riga, un difetto che condivide con la tua versione.)
Gilles "SO- smetti di essere malvagio",

Questo esempio non funziona quando ci sono 3 o più righe di testo :(
artnikpro

12

Mentre sed può abbinare i pattern su più linee (usando i comandi No Hper aggiungere righe successive prima della corrispondenza), questo è ben al di fuori della sua zona di comfort. Tentalo solo se ti piace il dolore.

Perl può fare bene questo tipo di cose. Utilizzare l' -pinterruttore per elaborare l'elaborazione standard di un record alla volta e stampare il record modificato (à la sed) e -000attivare la modalità paragrafo (in cui i record sono separati da righe vuote). In un'espressione regolare, \scorrisponde a qualsiasi carattere di spazio bianco inclusa una nuova riga.

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'

Se vuoi inserire una nuova riga nel testo di sostituzione quando l'originale ne contiene uno, è più complicato. Come farlo dipende dalle vostre esigenze su dove mettere la nuova riga.


@terdon Ah, intendevo consentire più spazi bianchi ma ho dimenticato. Grazie, risolto.
Gilles 'SO- smetti di essere malvagio' il

La domanda riguarda sed. È anche taggato con sed, non con perl.
Radu Rădeanu,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.