我正在学习awk,我想知道是否存在将更改写入文件的选项,类似于sed我使用-i选项将更改保存到文件的位置。
我确实知道我可以使用重定向来编写更改。但是,有选择awk吗?
我正在学习awk,我想知道是否存在将更改写入文件的选项,类似于sed我使用-i选项将更改保存到文件的位置。
我确实知道我可以使用重定向来编写更改。但是,有选择awk吗?
Answers:
在最新的GNU Awk(从4.1.0版本开始)中,它具有“就地”文件编辑的选项:
使用新工具构建的“ 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
              inplace实际上,gawk根据iiSeymour的答案,它实际上是一个包含在库中的库,因此inplace也可以作为includefile。
                    除非您拥有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年10月5日发行)中添加了此功能。它不像直接提供-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
该变量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
我很高兴已经添加了此功能,但对我来说,实现不是很糟糕,因为强大的功能来自语言的简洁性,而且imo-i inplace长度为8个字符。
这是官方单词手册的链接。
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file吗?
                    awk '{print $0}' file | sponge file使用。spongemoreutils
                    一种替代方法是使用sponge:
awk '{print $0}' your_file | sponge your_file
在其中用'{print $0}'awk脚本和your_file要在适当位置编辑的文件名替换。
sponge 在将输入保存到文件之前,它会完全吸收输入。
sponge是的一部分moreutils。因此,默认情况下,它不会在大多数系统中显示。但是看起来至少sponge它本身具有足够的可移植性,并且几乎可以在任何地方运行。
                    tee是sponge在写入之前会将所有内容读取到RAM,因此它将冻结在大文件上。