2012-03-06 21 views
9

In Linux quale comando è possibile utilizzare per sostituire una singola riga di testo con nuove linee multiple? Voglio cercare una parola chiave su una riga e cancellare questa riga e sostituirla con più nuove linee. Quindi nel testo mostrato di seguito voglio cercare la riga che contiene "parola chiave" e sostituire l'intera linea con 3 nuove righe di testo come mostrato.Sostituire una singola riga con più righe di testo

Per esempio sostituendo la riga che contiene la parola chiave,

This is Line 1 
This is Line 2 that has keyword 
This is Line 3 

cambiato a questo:

This is Line 1 
Inserted is new first line 
Inserted is new second line 
Inserted is new third line 
This is Line 3 
+2

si intende sostituire un numero di riga specifico o la/e riga/e corrispondente a "^ Questa è la riga 2 $"? uno può essere fatto con sed – technosaurus

+0

Le linee corrispondenti. Non sono abbastanza sicuro di come sostituire una singola linea di corrispondenza con più linee come mostrato con sed. – SSS

+1

Ho aggiornato l'originale per chiarezza. – SSS

risposta

12
$ sed '/keyword/c\ 
> Inserted is new first line\ 
> Inserted is new second line\ 
> Inserted is new third line' input.txt 

This is Line 1 
Inserted is new first line 
Inserted is new second line 
Inserted is new third line 
This is Line 3 

$ e > sono bash prompt dei

+2

Come credi che dopo che è trascorsa un'ora senza che nessuno risponda alla domanda, riesci a inviare la tua risposta solo un minuto prima del mio! –

+2

Puramente una coincidenza – kev

+1

Grazie! Questo mi stava facendo impazzire cagnaccio da pipistrello b/c '\ n' non funzionava. – SaxDaddy

8

Creare un file, script.sed, contenente:

/keyword/{i\ 
Inserted is new first line\ 
Inserted is new second line\ 
Inserted is new third line 
d 
} 

applicarlo ai dati:

sed -f script.sed your_data 

Ci sono numerose variazioni su come farlo, utilizzando i c e a comandi invece di i e/o d, ma questo è abbastanza pulito. Trova la parola chiave, inserisce tre righe di dati, quindi elimina la riga contenente la parola chiave. (Il comando c fa che tutti, ma non mi ricordo che esisteva, e il comando a aggiunge il testo ed è essenzialmente sinonimo di i in questo contesto.)

+0

Può essere incorporato in un singolo script bash? Preferirei tenerlo in un file. – flickerfly

+1

@flickerfly: Sì, può essere eseguito senza il file separato. Di solito è più semplice con il file, però. Dipende in parte da ciò che è nelle righe da inserire, ma se includono testo come 'Ha detto," Non farlo! Non devi, anche per $ 100. "', Gestendo che in uno script di shell diventa un vero dolore (devi sfuggire ad alcune delle citazioni, in qualche modo), ma è quasi banale con il file separato 'script.sed'. Per testo semplice, è sufficiente inserire tutto lo script tra virgolette singole. Hai bisogno dei backslash: "sed" deve vederli. Se devi usare le virgolette doppie, dovrai raddoppiare le barre inverse. –

+1

Per inciso, [kev] (http://stackoverflow.com/users/348785/kev) 's [risposta] (http://stackoverflow.com/a/9576547/15168) mostra come può essere fatto in un singolo script, senza una discussione approfondita degli shenanigans che potrebbero essere necessari se il testo sostitutivo contiene caratteri di citazione. –

1

puoi farlo utilizzando comandi incorporati della shell troppo:

STRING1_WITH_MULTIPLE_LINES="your 
text 
here" 

STRING2_WITH_MULTIPLE_LINES="more 
text" 

OUTPUT="" 
while read LINE || [ "$LINE" ]; do 
    case "$LINE" in 
    "Entire line matches this")OUTPUT="$OUTPUT$STRING1_WITH_MULTIPLE_LINES 
";; 
    *"line matches this with extra before and/or after"*)OUTPUT="$OUTPUT$STRING2_WITH_MULTIPLE_LINES 
";; 
    *)OUTPUT="$OUTPUT$LINE 
";; 
    esac 
done < file 
echo "$OUTPUT" >file 
+1

non devi impostare le stringhe come variabili al di fuori del blocco while-read-case ... possono essere solo OUTPUT = "$ OUTPUTyour \ ntext \ nhere" ... sostituendo \ n con le nuove linee effettive – technosaurus

Problemi correlati