我正在学习 awk,我想知道是否有一个选项写的修改文件,类似于 sed,其中我会使用 -i选项保存修改文件。
awk
sed
-i
我知道我可以使用重定向来写更改。但是,在 awk中有这样做的选项吗?
除非你有 GNU awk 4.1.0或更高版本..。
您不会有 sed 的 -i选项这样的选项,所以改为:
$ awk '{print $0}' file > tmp && mv tmp file
注意: -i并不神奇,它还创建了一个临时文件 sed只是为您处理它。
从 GNU awk 4.1.0开始..。
GNU awk在版本4.1.0 (2013年5月10日发布)中添加了这个功能。它并不像公布的说明中所描述的那样直截了当地给出 -i选择:
GNU awk
New-i 选项(来自 xgawk)用于加载 awk 库文件。这与 -f 的不同之处在于,第一个非选项参数 被视为一个脚本。
您需要使用捆绑的 inplace.awk include 文件来正确调用扩展,如下所示:
inplace.awk
$ cat file 123 abc 456 def 789 hij $ gawk -i inplace '{print $1}' file $ cat file 123 456 789
变量 INPLACE_SUFFIX可用于指定备份文件的扩展名:
INPLACE_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
我很高兴添加了这个特性,但对我来说,实现并不是很笨拙,因为它的力量来自语言的简洁性,而且 -i inplace是8个字符太长的 即时通讯。
-i inplace
这里有一个官方单词的 手册链接。
@ sudo _ O 拥有正确的 回答。
这行不通:
someprocess < file > file
Shell 执行重定向 之前,将控制权交给某个进程(改变方向)。>重定向将把文件截断为零大小(重定向输出)。因此,当某个进程启动并希望从文件中读取时,将没有数据供其读取。
>
在 GNU Awk 4.1.0(2013年发布)和更高版本中,它有 “替换”文件编辑的选项:
使用新工具构建的“ inplace”扩展可以用来模拟 GNU“ sed -i”特性
sed -i
示例用法:
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
保留备份:
$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") } > { print }' file1 file2 file3
如果您想要一个只有 awk 的解决方案,而不需要创建临时文件,并且可以使用 version! = (gawk 4.1.0) :
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file
只是个小黑客
echo "$(awk '{awk code}' file)" > file
跟踪是行不通的
echo $(awk '{awk code}' file) > file
这应该能行
另一种选择是使用 sponge:
sponge
awk '{print $0}' your_file | sponge your_file
其中,您将 '{print $0}'替换为 awk 脚本,将 your_file替换为要在适当位置编辑的文件的名称。
'{print $0}'
your_file
sponge在将输入保存到文件之前完全吸收它。