Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用awk换行_Bash_Awk - Fatal编程技术网

Bash 用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

例如,我试图用awk替换文件中的一行

更改此选项:

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