GNU awk
(зазвичай зустрічається в системах Linux), починаючи з версії 4.1.0, здатний включати " awk
вихідну бібліотеку" з -i
або --include
в командному рядку. Одна з вихідних бібліотек, яка поширюється з GNU awk
, називається inplace
:
$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello
Як бачите, це змушує вихідний awk
код замінити вхідний файл. Повідомлення рядка there
не зберігається, оскільки воно не виводиться програмою.
Маючи awk
сценарій у файлі, ви б його використовували так
awk -i inplace -f script.awk datafile
Якщо awk
змінна INPLACE_SUFFIX
встановлена на рядок, то бібліотека зробить резервну копію вихідного файлу з суфіксом імені файлу.
awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile
Якщо у вас є кілька вхідних файлів, то кожен файл має бути відредагований окремо на місці. Але ви можете вимкнути редагування на місці для файлу (або набору файлів), використовуючи inplace=0
командний рядок перед цим файлом:
awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4
У наведеній вище команді file3
не буде змінено на місці.
Для більш портативного "редагування на місці" одного файлу використовуйте
tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"
Це скопіює вхідний файл у тимчасове місце, після чого застосуйте awk
код до тимчасового файлу, перенаправляючи його на вихідне ім'я файлу.
Виконання операцій у цьому порядку (працює awk
над тимчасовим файлом, а не над оригінальним файлом) гарантує, що метадані файлу (дозволи та права власності) на вихідний файл не змінюються.