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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow