用awk改变一行

Jos*_*pas 10 bash awk

我试图用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)

  • 这在 OSX 上不起作用:) /sf/ask/297294791/ (2认同)

qbe*_*220 20

您的awk是正确的,但是您将重定向到与原始文件相同的文件.这导致原始文件在读取之前被覆盖.您需要将输出重定向到其他文件.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new
Run Code Online (Sandbox Code Playgroud)

必要时,重新命名Prueba.new.

  • +1.强调"原始文件[被]覆盖*之前*已被阅读" (2认同)

Cha*_*ssy 5

正如其他答案和问题“为什么通过 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)