我刚跑
cat /opt/webapplications/Word/readme.log | grep -v 'Apple'
我在 cli 上得到了我所期待的输出,其中所有的行readme.log
都不包含 ' Apple
'...
接下来我跑了...
cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log
然而,/opt/webapplications/Word/readme.log
是空白的。
谁能向我解释为什么会发生这种情况,或者我应该采取的正确方法?
发生这种情况是因为首先要做的
>
是创建它想要写入的文件 - 如果该文件已经存在,它的内容将被删除。(此外,根本不需要cat
在您的语句中使用,因为grep
它适用于文件,而不仅仅是 STDIN。)正确的方法是使用临时文件进行读取或写入。所以要么
或者
会工作。
当重定向到同一个文件 ( ) 时,shell 可能会在调用命令并读取输入
>
之前创建/截断文件(请参阅:为什么“排序文件 1 > 文件 1”不起作用?)。如果要过滤文件,最好将输出重定向到不同的文件,或者完全避免重定向,例如:cat
更好更安全的方法是使用专为此类操作设计的就地编辑器,例如
或使用
ex
(Vim 的一部分):有关的: