GNU awk
(powszechnie spotykany w systemach Linux), od wersji 4.1.0, może zawierać „ awk
bibliotekę źródłową” za pomocą -i
lub --include
w wierszu poleceń. Jedną z bibliotek źródłowych dystrybuowanych wraz z GNU awk
jest jedna o nazwie inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Jak widać, powoduje to, że awk
kod wyjściowy zastępuje plik wejściowy. Napis w wierszu there
nie jest zachowywany, ponieważ nie jest generowany przez program.
Ze awk
skryptem w pliku, używałbyś go tak jak
awk -i inplace -f script.awk datafile
Jeśli awk
zmienna INPLACE_SUFFIX
jest ustawiona na ciąg znaków, biblioteka utworzy kopię zapasową oryginalnego pliku z tym rozszerzeniem.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Jeśli masz kilka plików wejściowych, każdy plik należy edytować osobno w miejscu. Ale możesz wyłączyć edycję w miejscu dla pliku (lub zestawu plików), używając inplace=0
wiersza poleceń przed tym plikiem:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
W powyższym poleceniu file3
nie będzie edytowane w miejscu.
Aby uzyskać bardziej przenośną „edycję w miejscu” pojedynczego pliku, użyj
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Spowodowałoby to skopiowanie pliku wejściowego do tymczasowej lokalizacji, a następnie zastosowanie awk
kodu do pliku tymczasowego podczas przekierowywania do oryginalnej nazwy pliku.
Wykonanie operacji w tej kolejności (uruchamianie awk
pliku tymczasowego, a nie oryginalnego) zapewnia, że metadane pliku (uprawnienia i własność) oryginalnego pliku nie zostaną zmodyfikowane.