GNU/Linux >> Linux Esercitazione >  >> Linux

Come utilizzare Sed o Ex per sostituire un blocco (codice multilinea) con un nuovo blocco di testo (codice)?

Devo sostituire un grosso blocco di testo (codice script della shell) in un file con un altro blocco di testo.

Sono impressionato da Come posso usare sed per sostituire una stringa multilinea? risposto da
antak e sostituzione multi-riga risposto da Bruce Ediger

Ma ho qualche problema nell'usarli.

  1. antak ha già menzionato nella sua risposta che lo streaming dell'intero file (1h;2,$H;$!d;g; ) al buffer non è consigliabile per file di grandi dimensioni, perché sovraccarica la memoria.

  2. Conosco sed può essere utilizzato con la funzione di blocco per mantenere inalterato il testo all'esterno del blocco. Voglio usare questa funzione. Ma se uso,

    sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
    

inserirà il nuovo testo (codice) ripetutamente per ogni flusso. Quindi devo creare il blocco visivo come un unico flusso, usando qualcosa di simile a quanto suggerito da antak in precedenza, ma per il blocco (non per l'intero file).

  1. Come accennato da Bruce Ediger, aggiungi funzionalità di ex che iniziano con a termina con . (punto) può essere provato, ma il mio nuovo testo (codice) contiene righe che iniziano con punto, che può essere considerato come il punto della sintassi append. Come posso usarlo in questa situazione?

  2. ex 's dd 'numero di righe' può eliminare più righe, ma se ho un blocco tra /marker1/ e /marker2/ con il numero di righe non fisso (variabile) deve essere sostituito con un nuovo testo (codice), come si fa?

Risposta accettata:

Suggerisco di utilizzare il c hange comando
(che è essenzialmente un d elete accoppiato con una a ppend, anche se append viene applicato solo per l'ultima riga nell'intervallo che è esattamente quello che vuoi qui):

sed -i '/marker1/,/marker2/c
New text 1
New text 2' filename

Qui usando GNU sed sintassi di 's per la modifica sul posto (-i ). Quel c il comando è altrimenti standard e portatile. GNU sed supporta:

sed '/marker1/,/marker2/cNew text 1
New text 2' filename

come estensione non standard.

I caratteri di nuova riga e barra rovesciata devono essere sottoposti a escape (con barra rovesciata) nel testo sostitutivo.


Linux
  1. Come sostituire una stringa in un file?

  2. Come utilizzare Sed per sostituire una stringa multilinea?

  3. Come sostituire una stringa con una stringa contenente una barra con Sed?

  4. Come usare sed per sostituire la variabile di un file di configurazione?

  5. Come sostituire in modo ricorsivo i caratteri con sed?

Come uso Vagrant con libvirt

Come utilizzare sed per trovare e sostituire la stringa nei file

Come utilizzare il comando Sed in Linux con esempi

COME USARE SED EDITOR

I 20 migliori comandi sed da usare

Come utilizzare Sed per trovare e sostituire una stringa in un file