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

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

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

cat file | sed 's/^/#/g' > file

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

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

cat file | sed 's/^/#/g' > /tmp/file; mv /tmp/file file

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

答案1

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

sed -i 's/^/#/g' file

相关内容