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