sed
Modifica sul posto
Ricerca…
Sintassi
- estensione sed -I - FreeBSD sed (contatore di riga continuo)
- sed -I [ estensione ] - NetBSD e Illumos sed (contatore di riga continuo)
- estensione sed -i - FreeBSD sed
- sed -i [ estensione ] - NetBSD, OpenBSD, Illumos, BusyBox e GNU sed
- sed --in-place [= estensione ] - Illumos, BusyBox e GNU sed
Parametri
| Parametro | Dettagli |
|---|---|
extension | Salva un file di backup con l'estensione specificata, o nessun file di backup quando l' extension è una stringa di lunghezza zero. |
Osservazioni
La modifica sul posto è un'estensione comune ma non standard presente nella maggior parte dei sistemi recenti.
Da un manuale di BSD sed
(una sezione come questo appare in tutti BSD correnti sed manuali, e quella dei loro derivati)
Non è consigliabile assegnare un'estensione di lunghezza zero quando si modificano i file sul posto, in quanto rischia la corruzione o il contenuto parziale in situazioni in cui lo spazio su disco è esaurito, ecc.
Non dimenticare il potente ed
C'è sicuramente un uso per sed e per le funzionalità di modifica sul posto di sed , ma quando lo standard UNIX è esteso, dovremmo sempre chiedere perché il vecchio standard UNIX non includesse quella funzionalità. Sebbene UNIX non sia perfetto, l'ortogonalità e la completezza degli strumenti sono state sviluppate per essere abbastanza vicine alla perfezione, almeno per scopi che erano visibili intorno al 1970: l' editing del testo e l'editing automatico del testo erano sicuramente visibili in quel periodo.
In realtà, l'idea di sed non è quella di modificare un file sul posto, ma di modificare un flusso . Ecco perché il nome sed è una breve forma di editor di stream . Portare via la s , e si ottiene lo strumento che è stato effettivamente progettato per la modifica dei file : ed :
printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file
o cat file_edit_commands | ed file .
Sostituzione di stringhe in un file sul posto
sed -i s/"what to replace"/"with what to replace"/g $file
Utilizziamo -i per selezionare la modifica sul posto sul $file file. In alcuni sistemi è necessario aggiungere il suffisso dopo -i flag che verrà utilizzato per creare il backup del file originale. È possibile aggiungere una stringa vuota come -i '' per omettere la creazione del backup. Guarda le osservazioni in questo argomento sull'opzione -i .
Il terminatore g indica una ricerca / sostituzione globale in ogni riga.
$ cat example
one
two
three
total
$ sed -i s/"t"/"g"/g example
$ cat example
one
gwo
ghree
gogal
Uso portatile
La modifica sul posto, sebbene comune, è una funzione non standard. Un'alternativa valida sarebbe quella di utilizzare un file intermedio per memorizzare l'originale o l'output.
sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file
Per utilizzare l'opzione -i con la sintassi GNU e FreeBSD, è necessario specificare un'estensione e aggiungerla all'opzione -i . Quanto segue sarà accettato da entrambi e produrrà due file, la versione originale su file.orig e la versione modificata su file :
sed -i.orig 'sed commands' file
Vedi un esempio di base dato un file di file :
$ cat file
one
two
three
$ sed -i.orig 's/one/XX/' file
$ cat file # the original file has changed its content
XX
two
three
$ cat file.orig # the original content is now in file.orig
one
two
three
Un esempio più complesso, sostituendo ogni riga con il numero di riga:
$ printf 'one\ntwo\n' | tee file1 | tr a-z A-Z > file2
$ sed -ni.orig = file1 file2
$ cat file1.orig file2.orig
one
two
ONE
TWO
$ cat file1 file2
1
2
1
2
Perché è richiesto un file di backup
Per poter utilizzare la modifica sul posto senza un file di backup, -i deve avere un argomento di lunghezza zero e FreeBSD sed richiede un argomento per -i , aggiunto o separato, mentre l'estensione di argomento facoltativa di GNU richiede l'aggiunta dell'argomento a -i Entrambi supportano l'argomento a -i , ma senza che sia richiesto -i'' command è indistinguibile dall'estensione -i extension , e quindi un argomento di lunghezza zero non può essere aggiunto a -i .
La modifica sul posto senza specificare un file di backup sostituisce le autorizzazioni di sola lettura
sed -i -e cmd file modificherà il file anche se le sue autorizzazioni sono impostate in sola lettura.
Questo comando si comporta in modo simile a
sed -e cmd file > tmp; mv -f tmp file
piuttosto che
sed -e cmd file > tmp; cat tmp > file; rm tmp
L'esempio seguente utilizza gnu sed :
$ echo 'Extremely important data' > input
$ chmod 400 input # Protect that data by removing write access
$ echo 'data destroyed' > input
-bash: input: Permission denied
$ cat input
Extremely important data (#phew! Data is intact)
$ sed -i s/important/destroyed/ input
$ cat input
Extremely destroyed data (#see, data changed)
Questo può essere mitigato creando un backup specificando un SUFFIX con l'opzione i :
$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data