awk保存修改到位
我正在学习awk
,我想知道是否有一个选项来修改文件,类似于sed
我将使用-i
选项来保存对文件的修改。
我明白我可以使用redirect来写入更改。 但是有没有在awk
的选项做到这一点?
在最新的GNU Awk(自4.1.0发布以来),它可以select“就地”文件编辑 :
[…]使用新工具构build的“inplace”扩展可用于模拟GNU“
sed -i
”function。 […]
用法示例:
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
要保持备份:
$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") } > { print }' file1 file2 file3
除非你有GNU awk 4.1.0或更高版本…
你不会有sed的-i
选项这样的选项,而是做:
$ awk '{print $0}' file > tmp && mv tmp file
注意: -i
不是魔术,它也是创build一个临时文件sed
只是为你处理它。
从GNU awk 4.1.0开始…
GNU awk
在版本4.1.0 (2013年10月5日发布)中增加了这个function。 不像发布的注释中所描述的那样给出-i
选项就不那么简单:
新的-i选项(来自xgawk)用于加载awk库文件。 这与-f的不同之处在于,第一个非选项参数被视为脚本。
您需要使用捆绑的inplace.awk
包含文件来正确调用扩展,如下所示:
$ cat file 123 abc 456 def 789 hij $ gawk -i inplace '{print $1}' file $ cat file 123 456 789
variablesINPLACE_SUFFIX
可以用来指定备份文件的扩展名:
$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file $ cat file 123 456 789 $ cat file.bak 123 abc 456 def 789 hij
我很高兴这个function已被添加,但对我来说,实施并不是很强大,因为权力是语言的简洁和-i inplace
是8个字符长IMO 。
这是一个官方词汇手册的链接。
@sudo_O有正确的答案 。
这不能工作:
someprocess < file > file
在把控制交给一些进程( redirect ) 之前 ,shell执行redirect 。 >
redirect会将文件截断为零( redirect输出 )。 因此,当某个进程启动并想从文件中读取时,就没有数据可供读取。
以下将无法正常工作
echo $(awk '{awk code}' file) > file
这应该工作
echo "$(awk '{awk code}' file)" > file
只是一个小黑客的作品
echo "$(awk '{awk code}' file)" > file
如果你想要一个awk专有的解决scheme,而不需要创build一个临时文件并且可以使用version!=(gawk 4.1.0):
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file
另一种方法是使用sponge
:
awk '{print $0}' your_file | sponge your_file
用awk脚本replace'{print $0}'
用你想要编辑的文件名replaceyour_file
。
sponge
吸收完整的input之前,将其保存到文件。