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