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

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

重複の可能性あり:
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

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

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

関連情報