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