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над тимчасовим файлом, а не над оригінальним файлом) гарантує, що метадані файлу (дозволи та права власності) на вихідний файл не змінюються.