我有一个命令,它试图只读取一个文件,然后不加区别地注释掉其中的每一行,然后覆盖现有文件。
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)
为什么我的原始解决方案不起作用?
您的原始解决方案不起作用,因为一旦您重定向,shell 就会以该名称创建一个空文件。您可以使用-i
选项sed
来解决此问题。例如,
sed -i 's/^/#/g' file
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1880 次 |
最近记录: |