リダイレクトはファイルを上書きせずに空のファイルを作成します。

リダイレクトはファイルを上書きせずに空のファイルを作成します。

ファイルのみを読み込み、その中のすべての行を無差別にコメントアウトし、既存のファイルを上書きするコマンドがあります。

cat file | sed 's/^/#/g' > file

しかし、驚くべきことに、これは実際には機能せず、実際には空のファイルを生成します。パイプの私の理解によれば、stdoutがsedに入り、sedによって処理され、次にファイルに転送されることを考えると、これは起こらないでください。それで、なぜこれが起こるのか知りたいです。

予想される動作を置き換える回避策を実装しました。

cat file | sed 's/^/#/g' > /tmp/file; mv /tmp/file file

元のソリューションが機能しないのはなぜですか?

ベストアンサー1

リダイレクトされるとすぐに、シェルはその名前の空のファイルを生成するため、元のソリューションは機能しません。この問題を解決する-iオプションがあります。sed例えば、

sed -i 's/^/#/g' file

おすすめ記事