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.
-
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. -
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).
-
Come accennato da Bruce Ediger, aggiungi funzionalità di
ex
che iniziano cona
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? -
ex
'sdd
'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.