Apporta più modifiche con una sola chiamata a sed


15

Sto cercando di usare sed per modificare un file di configurazione. Ci sono alcune righe che vorrei cambiare. So che sotto Linux sed -iconsente modifiche sul posto ma richiede il salvataggio in un file di backup. Tuttavia, vorrei evitare di avere più file di backup e apportare tutte le mie modifiche sul posto contemporaneamente.

C'è un modo per farlo con sed -io c'è un'alternativa migliore?

Risposte:


21

Puoi dire seddi eseguire più operazioni semplicemente ripetendo -e(o -fse il tuo script è in un file).

sed -i -e 's/a/b/g' -e 's/b/d/g' fileapporta entrambe le modifiche nel singolo file denominato file, sul posto. Senza un file di backup.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' fileapporta entrambe le modifiche nel singolo file denominato file, sul posto. Con un singolo file di backup denominato filebak.


2
Si noti che la sequenza è importante. Nel comando di esempio riportato sopra, tutte le istanze della lettera avengono trasformate in b, quindi tutte le istanze di bvengono trasformate in d. Potresti fare la stessa cosa con sed -i -e 's/a\|b/d/g' file—turn tutte le istanze di uno ao bin d.
Wildcard l'

4

Un'altra alternativa è ex, il predecessore di vi. In realtà è lo strumento POSIX preferito per la modifica di file con script sul posto; è straordinariamente più flessibile di sed -ie probabilmente anche più portatile di Perl. (Se rimani al di fuori del mondo di Windows, è indiscutibilmente più portatile di Perl.)

C'è una relativa carenza in questo stackexchange di comandi di esempio usando ex, almeno rispetto alla pletora di comandi di esempio usando sed, awke Perl. Tuttavia, io stesso ho approfondito ampiamente le specifiche POSIXex e da allora ho battuto il tamburo per questo. Ho scritto molte risposte usando exsia qui che nello stackexchange di vi / Vim:

Ulteriori letture:


3

Oltre a utilizzare più -e opzioni, puoi anche separare i comandi sed in un singolo script sed usando newline o punti e virgola.

Questo è il caso se quello script è un liner sulla riga di comando o un file di script.

per esempio

sed -e 's/a/b/g ; s/b/d/g' file

I caratteri dello spazio attorno al ; sono opzionali. Li ho usati qui per assicurarsi che il punto e virgola si distingua (in generale, tranne per le nuove righe che separano i comandi, lo spazio bianco tra i comandi viene ignorato ... ma non dimenticare che lo spazio bianco all'interno dei comandi può essere e di solito lo è significativo).

o:

sed -e 's/a/b/g
        s/b/d/g' file
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.