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
在临时文件上运行,而不在原始文件上运行)可确保原始文件的文件元数据(权限和所有权)不会被修改。