我正在学习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
使用。sponge
moreutils
一种替代方法是使用sponge
:
awk '{print $0}' your_file | sponge your_file
在其中用'{print $0}'
awk脚本和your_file
要在适当位置编辑的文件名替换。
sponge
在将输入保存到文件之前,它会完全吸收输入。
sponge
是的一部分moreutils
。因此,默认情况下,它不会在大多数系统中显示。但是看起来至少sponge
它本身具有足够的可移植性,并且几乎可以在任何地方运行。
tee
是sponge
在写入之前会将所有内容读取到RAM,因此它将冻结在大文件上。