2012-02-29 53 views
6

林试图在使用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使替代,但文件结束空白!

回答

18

另一个答案,使用不同的工具(SED,和-i(到位)标志)

sed -i '/e2/ s/off/on/' ~/Documents/Prueba 
17

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

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

如果需要,可以重新命名为Prueba.new。

+2

+1。强调“原始文件在被读取之前被覆盖* – 2012-02-29 17:07:46

0

您不能重定向到与输入文件相同的文件。选择另一个文件名。

>将首先清空您的文件。

2

正如其他的答案,并在问题“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