Bash 用awk换行
例如,我试图用awk替换文件中的一行 更改此选项:Bash 用awk换行,bash,awk,Bash,Awk,例如,我试图用awk替换文件中的一行 更改此选项: e1 is (on) e2 is (off) 致: 使用命令: awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba 这将进行替换,但文件结尾为空 您的awk是正确的,但是您正在重定向到与原始文件相同的文件。这会导致原始文件在读取之前被覆盖。您需要将输出重定向到其他文件 awk '/e2/{gsub(/off/, "on")};{p
e1 is (on)
e2 is (off)
致:
使用命令:
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba
这将进行替换,但文件结尾为空 您的awk是正确的,但是您正在重定向到与原始文件相同的文件。这会导致原始文件在读取之前被覆盖。您需要将输出重定向到其他文件
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new
如有必要,请稍后重命名Prueba.new。您不能重定向到与输入文件相同的文件。选择另一个文件名
将首先清空您的文件。另一个答案,使用不同的工具(sed和-i(就地)标志)
您也可以使用
cat
先读取文件,然后使用pipe
重定向到stdout,然后使用awk
从stdin读取:
cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba
我相信破折号-
是可选的,因为您只阅读标准文本
一些有趣的文档:正如其他答案和问题“”中所解释的,shell重定向会在读取输入文件之前将其销毁 要在不显式地求助于临时文件的情况下解决该问题,请查看集合中的命令
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba
或者,如果系统上安装了GNU awk,则可以使用
+1.强调“原始文件在读取之前被覆盖”,这在OSX上不起作用:)
cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba
gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba