GNU awk(häufig auf Linux-Systemen zu finden) kann seit Version 4.1.0 eine " awkQuellbibliothek" mit -ioder --includein der Befehlszeile enthalten. Eine der Quellbibliotheken, die mit GNU verteilt awkwird, 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 awkCodes die Eingabedatei. Das Zeilenspruch therewird nicht beibehalten, da es nicht vom Programm ausgegeben wird.
Mit einem awkSkript in einer Datei würden Sie es gerne verwenden
awk -i inplace -f script.awk datafile
Wenn die awkVariable INPLACE_SUFFIXauf 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=0in der Befehlszeile vor dieser Datei Folgendes verwenden:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
Im obigen Befehl file3wü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 awkCode 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 awkin der temporären Datei, nicht in der Originaldatei) wird sichergestellt, dass die Datei-Metadaten (Berechtigungen und Besitz) der Originaldatei nicht geändert werden.