awk保存修改到位

Dea*_*ano 120 unix linux awk

我正在学习awk,我想知道是否有一个选项可以将更改写入文件,类似于sed我将使用-i选项保存对文件的修改.

我明白我可以使用重定向来编写更改.但是有没有选择awk呢?

Chr*_*our 123

除非你有GNU awk 4.1.0或更高版本......

你不会有像sed -i选项这样的选项,所以改为:

$ awk '{print $0}' file > tmp && mv tmp file
Run Code Online (Sandbox Code Playgroud)

注意:这-i不是魔术,它也是创建一个临时文件,sed只为你处理它.


截至GNU awk 4.1.0 ...

GNU awk在4.1.0版(2013年10月10日发布)中添加了此功能.它不像正如-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
Run Code Online (Sandbox Code Playgroud)

该变量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
Run Code Online (Sandbox Code Playgroud)

我很高兴这个功能已被添加,但对我来说,实现并不是非常糟糕,因为功能是语言的简洁性和-i inplaceIMO 8个字符.

这是官方单词手册的链接.

  • 更短的 `awk '{print $0}' 文件 | 使用 `moreutils` 中的 `sponge` 的海绵文件`。 (2认同)

小智 119

在最新的GNU Awk(自4.1.0发布以来)中,它可以选择"inplace"文件编辑:

[...]使用新工具构建的"inplace"扩展可用于模拟GNU" sed -i"功能.[...]

用法示例:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

要保留备份:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
> { print }' file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

  • @Keith 我有同样的问题。我刚刚尝试过,它适用于我的 4.1.3。根据 [iiSeymour 的回答](http://stackoverflow.com/a/16529730/2877364),`inplace` 实际上是一个包含在 `gawk` 中的库,因此 `inplace` 是可以作为 `includefile` 包含的内容。 (2认同)

gle*_*man 13

@sudo_O有正确的答案.

这不起作用:

someprocess < file > file
Run Code Online (Sandbox Code Playgroud)

将控制权移交给某些进程(重定向)之前,shell执行重定向.该>重定向将文件截断至零大小(重定向输出).因此,当某个进程启动并想要从文件中读取时,没有数据可供读取.


Yur*_* G. 12

只是一个有效的小黑客

echo "$(awk '{awk code}' file)" > file
Run Code Online (Sandbox Code Playgroud)


Cod*_*ope 11

另一种方法是使用sponge:

awk '{print $0}' your_file | sponge your_file
Run Code Online (Sandbox Code Playgroud)

您使用'{print $0}'awk脚本替换的位置以及your_file要编辑的文件的名称.

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

  • 海绵是moreutils的一部分。因此,默认情况下,它不会在大多数系统中显示。但是看起来至少“海绵”本身具有足够的便携性,并且几乎可以在任何地方运行。 (2认同)
  • 与基于`tee` 的解决方案相比,该解决方案的缺点是`sponge` 会在写入之前将所有内容读取到RAM,因此它会在大文件上冻结。 (2认同)

小智 5

以下将无法正常工作

echo $(awk '{awk code}' file) > file
Run Code Online (Sandbox Code Playgroud)

这应该工作

echo "$(awk '{awk code}' file)" > file
Run Code Online (Sandbox Code Playgroud)