GNU awk
(häufig auf Linux-Systemen zu finden) kann seit Version 4.1.0 eine " awk
Quellbibliothek" mit -i
oder --include
in der Befehlszeile enthalten. Eine der Quellbibliotheken, die mit GNU verteilt awk
wird, heißt inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Wie Sie sehen können, ersetzt die Ausgabe des awk
Codes die Eingabedatei. Das Zeilenspruch there
wird nicht beibehalten, da es nicht vom Programm ausgegeben wird.
Mit einem awk
Skript in einer Datei würden Sie es gerne verwenden
awk -i inplace -f script.awk datafile
Wenn die awk
Variable INPLACE_SUFFIX
auf eine Zeichenfolge festgelegt ist, erstellt die Bibliothek eine Sicherungskopie der Originaldatei mit dieser als Dateinamensuffix.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Wenn Sie mehrere Eingabedateien haben, wird jede Datei einzeln direkt bearbeitet. Sie können die direkte Bearbeitung einer Datei (oder einer Reihe von Dateien) jedoch deaktivieren, indem Sie inplace=0
in der Befehlszeile vor dieser Datei Folgendes verwenden:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Im obigen Befehl file3
würde nicht direkt bearbeitet.
Verwenden Sie für eine portablere "In-Place-Bearbeitung" einer einzelnen Datei
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Dies würde die Eingabedatei an einen temporären Speicherort kopieren und dann den awk
Code auf die temporäre Datei anwenden, während auf den ursprünglichen Dateinamen umgeleitet wird.
Durch Ausführen der Vorgänge in dieser Reihenfolge (Ausführen awk
in der temporären Datei, nicht in der Originaldatei) wird sichergestellt, dass die Datei-Metadaten (Berechtigungen und Besitz) der Originaldatei nicht geändert werden.