林试图在使用awk文件一行的替代,例如改变使用awk
行改变这样的:
e1 is (on)
e2 is (off)
到:
e1 is (on)
e2 is (on)
使用命令:
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba
this使替代,但文件结束空白!
林试图在使用awk文件一行的替代,例如改变使用awk
行改变这样的:
e1 is (on)
e2 is (off)
到:
e1 is (on)
e2 is (on)
使用命令:
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba
this使替代,但文件结束空白!
另一个答案,使用不同的工具(SED,和-i(到位)标志)
sed -i '/e2/ s/off/on/' ~/Documents/Prueba
您的awk是正确的,但是您将重定向到与原始文件相同的文件。这会导致原始文件在被读取之前被覆盖。您需要将输出重定向到其他文件。
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new
如果需要,可以重新命名为Prueba.new。
您不能重定向到与输入文件相同的文件。选择另一个文件名。
>
将首先清空您的文件。
您还可以使用cat
读取该文件,然后再使用pipe
重定向到标准输出,然后用awk
从标准输入读取:
cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba
我相信破折号-
是可选的,因为你只是读标准输入。
一些有趣的资料:https://www.gnu.org/software/gawk/manual/html_node/Naming-Standard-Input.html
正如其他的答案,并在问题“Why reading and writing the same file through I/O redirection results in an empty file in Unix?”解释说,读前壳重定向摧毁你的输入文件。
要解决该问题而不明确诉诸临时文件,请查看moreutils集合中的sponge命令。
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba
或者,如果GNU awk安装在您的系统上,则可以使用in place extension。
gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba
+1。强调“原始文件在被读取之前被覆盖* – 2012-02-29 17:07:46