Come posso ottenere il mio comando sed per apportare modifiche permanenti a un file?


32

È possibile? Ho letto da qualche parte che il seguente comando lo farebbe:

sed -e [comando] [file]

ma sembrava fare la stessa cosa di solo

sed [comando] [file]

(non ha salvato le modifiche). C'è un modo per farlo usando sed?


2
La -ebandiera sta per espressione. Probabilmente vuoi la -ibandiera, il che significa in-placeche ti consiglio vivamente di usare sed -i.bak 's/../' filename
Valentin Bajrami il

Risposte:


50

Penso che tu stia cercando -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Per esempio:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

Se si fornisce un suffisso, verrà creato un file di backup:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

Il file di input viene modificato e viene creato un backup contenente i dati del file originale.

Si noti inoltre che questo è per GNU sed, ci sono lievi differenze di formato tra le diverse sedimplementazioni.


4
Nota che la pagina man è sbagliata. sednon esegue modifiche sul posto. Crea un nuovo file e sovrascrive quello vecchio, l'inode cambia.
Marco,

2
@Marco Questo è il modo sicuro per modificare un file in atto. "Modifica di un file in atto" nella documentazione di sed significa che il file originale (come definito dal suo nome) viene modificato, non che il file originale (come definito dal suo inode) viene modificato.
Gilles 'SO- smetti di essere malvagio' il

2
@Gilles Sono pienamente d'accordo che questo è il modo preferito per modificare un file, ma difficilmente lo chiamerei sul posto . Ma ciò si riduce alla domanda su come viene identificato un file, per inode o per nome. Direi per inode, altrimenti contratti come { rm file; cmd > file; } < fileporterebbero alla conclusione che cmd legge e scrive nello stesso file, cosa che non accade. Sono due file distinti che hanno lo stesso nome. Ma non voglio iniziare una discussione qui.
Marco,

Su macOS 10.14 ottengo sed: 1: "foo.txt": invalid command code fquando corro sed -i 's/o/X/g' foo.txt. Tuttavia, fornendo un'estensione, come sed -i .bak 's/o/X/g' foo.txtfunziona benissimo. Qualche idea su come farlo funzionare senza creare file di backup?
Joshua Pinter

1
Okay, l'ho capito. In macOS devi aggiungere esplicitamente una stringa vuota per l'opzione param di estensione:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter

2

Queste soluzioni funzionano per HPUX (UNIX):

1 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh.:

2. perl -pi -e 's/Error/NO_Error/g' test1.sh

3. sed 's/Error/NO_Error/g' test1.sh | tee test1.sh



1

-eopzione è per l'esecuzione di più sedcomandi

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

considerare file.txtcome

linux os

allora O / P è

unix os

-i L'opzione salva le modifiche in modo permanente ...

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.