我试图用awk替换文件中的单行,例如
改变这个:
e1 is (on)
e2 is (off)
Run Code Online (Sandbox Code Playgroud)
至:
e1 is (on)
e2 is (on)
Run Code Online (Sandbox Code Playgroud)
使用命令:
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba
Run Code Online (Sandbox Code Playgroud)
这使得替换,但文件结束空白!
Dav*_*her 21
另一个答案,使用不同的工具(sed和-i(就地)标志)
sed -i '/e2/ s/off/on/' ~/Documents/Prueba
Run Code Online (Sandbox Code Playgroud)
qbe*_*220 20
您的awk是正确的,但是您将重定向到与原始文件相同的文件.这导致原始文件在读取之前被覆盖.您需要将输出重定向到其他文件.
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new
Run Code Online (Sandbox Code Playgroud)
必要时,重新命名Prueba.new.
正如其他答案和问题“为什么通过 I/O 重定向读取和写入同一个文件会导致 Unix 中的文件为空? ”所解释的那样,shell 重定向会在输入文件被读取之前破坏它。
要在不明确诉诸临时文件的情况下解决该问题,请查看moreutils集合中的海绵命令。
awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba
Run Code Online (Sandbox Code Playgroud)
或者,如果您的系统上安装了 GNU awk,您可以使用就地扩展。
gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba
Run Code Online (Sandbox Code Playgroud)