用 awk 保存修改

我正在学习 awk,我想知道是否有一个选项写的修改文件,类似于 sed,其中我会使用 -i选项保存修改文件。

我知道我可以使用重定向来写更改。但是,在 awk中有这样做的选项吗?

133135 次浏览

除非你有 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选择:

New-i 选项(来自 xgawk)用于加载 awk 库文件。这与 -f 的不同之处在于,第一个非选项参数 被视为一个脚本。

您需要使用捆绑的 inplace.awk include 文件来正确调用扩展,如下所示:

$ cat file
123 abc
456 def
789 hij


$ gawk -i inplace '{print $1}' file


$ cat file
123
456
789

变量 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个字符太长的 即时通讯

这里有一个官方单词的 手册链接。

@ sudo _ O 拥有正确的 回答

这行不通:

someprocess < file > file

Shell 执行重定向 之前,将控制权交给某个进程(改变方向)。>重定向将把文件截断为零大小(重定向输出)。因此,当某个进程启动并希望从文件中读取时,将没有数据供其读取。

在 GNU Awk 4.1.0(2013年发布)和更高版本中,它有 “替换”文件编辑的选项:

使用新工具构建的“ inplace”扩展可以用来模拟 GNU“ 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

这应该能行

echo "$(awk '{awk code}' file)" > file

另一种选择是使用 sponge:

awk '{print $0}' your_file | sponge your_file

其中,您将 '{print $0}'替换为 awk 脚本,将 your_file替换为要在适当位置编辑的文件的名称。

sponge在将输入保存到文件之前完全吸收它。