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

cwd*_*cwd 8 shell bash stdout stdin

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

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

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

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

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

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/tmp
mv ~/.ssh/tmp ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

然后一切都很好,但我很困惑,为什么读取和写入同一个文件的叶子空白的,如果有迂回方式,使用的时候grepcat等等。

Sha*_*off 12

有一个名为moreutils套件sponge的一部分的实用程序。它正是为此目的而制作的。

grep -v ec2 ~/.ssh/known_hosts | sponge ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

  • `cat` 可以随时写入其输出;如果它写入超过管道另一侧读取的任何内容的点,那么您将读取您写入的内容而不是原始文件内容。这就是海绵的特殊之处。它缓冲它的输入直到 `stdin` 关闭,然后写入。 (4认同)

gee*_*aur 7

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