web-dev-qa-db-ja.com

Linuxで同じファイルを上書きせずに読み書きできますか?

重複の可能性:
iconvに入力ファイルを変換された出力に置き換えるにはどうすればよいですか?

パブリックDNS名を使用してAmazonec2に頻繁に接続します
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

それなら問題はありませんが、同じファイルの読み取りと書き込みで空白のままになる理由と、grepcatなどを使用するときにこれを回避する方法があるかどうか混乱しています。

6
cwd

moreutils スイートの一部であるspongeというユーティリティがあります。それはまさにこの目的のために作られました。

grep -v ec2 ~/.ssh/known_hosts | sponge ~/.ssh/known_hosts
10
Shawn J. Goff

リダイレクトは、コマンドが実行される前にシェルによって実行されます。これは、grepがファイルを読み取る機会を得る前に、シェルがファイルを切り捨てるように指示されていることを意味します。シェルリダイレクトを使用している場合、これを回避する方法はありません。

7
geekosaur