重定向不是覆盖文件,而是生成一个空白文件

Gre*_*reg 2 shell

我有一个命令,它试图只读取一个文件,然后不加区别地注释掉其中的每一行,然后覆盖现有文件。

cat file | sed 's/^/#/g' > file
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,这实际上并不起作用,实际上只是生成一个空白文件。根据我对管道的理解,这不应该发生,因为 stdout 转到 sed,由 sed 处理然后发送到文件。所以我想知道为什么会这样

代替我的预期行为,我实施了一种解决方法。

cat file | sed 's/^/#/g' > /tmp/file; mv /tmp/file file
Run Code Online (Sandbox Code Playgroud)

为什么我的原始解决方案不起作用?

unx*_*nut 7

您的原始解决方案不起作用,因为一旦您重定向,shell 就会以该名称创建一个空文件。您可以使用-i选项sed来解决此问题。例如,

sed -i 's/^/#/g' file
Run Code Online (Sandbox Code Playgroud)