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.