Devo sostituire un grosso blocco di testo (codice script shell) in un file con un altro blocco di testo.
Sono rimasto impressionato da Come posso usare sed per sostituire una stringa multilinea? risposta di antak e sostituzione multilinea risposta di Bruce Ediger
Ma ho qualche problema ad usarli.
antak ha già menzionato nella sua risposta che lo streaming di file interi (
1h;2,$H;$!d;g;
) sul buffer non è consigliabile per file di grandi dimensioni, poiché sovraccarica la memoria.So che
sed
può essere utilizzato con la funzione di blocco per mantenere invariato il testo all'esterno del blocco. Voglio usare questa funzione Ma se uso,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
inserirà ripetutamente nuovo testo (codice) per ogni flusso. Quindi devo creare il blocco visivo come un flusso, usando qualcosa di simile a quello suggerito da Antak in precedenza, ma per il blocco (non per l'intero file).
Come accennato da Bruce Ediger, è possibile provare la funzione di aggiunta di
ex
inizio che inizia con laa
fine di.
(punto), ma il mio nuovo testo (codice) contiene righe che iniziano con punto, che può essere considerato il punto della sintassi di aggiunta. Come posso usarlo in questa situazione?ex
Ildd
"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 fare vero?
sed
o ex
comando funziona).
r
il comando read file, per copiare il testo da un altro file, se l'origine del testo sostitutivo si trova in un file.