我可以在 Linux 中读写同一个文件而不覆盖它吗?

我可以在 Linux 中读写同一个文件而不覆盖它吗?

可能的重复:
如何使 iconv 用转换后的输出替换输入文件?


我经常使用其公共 DNS 名称( )连接到 amazon ec2 ec2-12-34-56-78.compute-1.amazonaws.com,因此我的known_hosts文件被大量ec2条目淹没,我永远不会再使用。

我知道我可能可以使用sed -i就地编辑,但我想使用grep,所以我这样做了:

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/known_hosts

这会留下known_hosts一个空文件。如果我做:

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/tmp
mv ~/.ssh/tmp ~/.ssh/known_hosts

grep那么一切都很好,但我很困惑为什么读取和写入同一个文件会将其保留为空白,以及在使用、cat等时是否有任何解决方法。

答案1

有一个名为的实用程序,sponge它是更多实用程序套房。它就是为了这个目的而制作的。

grep -v ec2 ~/.ssh/known_hosts | sponge ~/.ssh/known_hosts

答案2

重定向是在命令运行之前由 shell 完成的。这意味着 shell 被告知在grep有机会读取文件之前截断该文件。如果您使用 shell 重定向,则无法解决此问题。

相关内容