sedの処理内容をファイルに吐き出す。ファイル名が同じではダメ ヽ(`Д´)ノ (2005.3.18 追記)


教訓:

めんどうでも別名ファイルに書き出し、その後リネームすることが必要。

やりたいこと:
aaa.txtの中の monday という文字列を sunday に変えたい。



これではうまくいきません(入力ファイルと出力ファイルが同名)

sed -e "s/monday/sunday/g" aaa.txt > aaa.txt

これだとうまくいきます(入力ファイルと出力ファイルが違うファイル名)

sed -e "s/monday/sunday/g" aaa.txt > aaa.tmp.txt
mv aaa.tmp.txt aaa.txt


理由は、処理順番のせい。

sed -e "s/monday/sunday/g" aaa.txt > aaa.txt

を実行すると、

  1. まず、出力先のaaa.txt が新規に生成される。この時、aaa.txtは空。
  2. できたaaa.txt(空)を入力にして、sedが実行される。


だから、実行後にaaa.txtをみても、空のままになってる。ほほぅ。


リダイレクトの際の処理順番をなんとなく都合のいいように誤解してた。
(誤解)本来なら標準出力にでるはずの実行結果は、リダイレクトされる場合には、どこか一時領域のようなところに退避されて、それが出力先のファイルにはきだされる。

(実際)リダイレクト先のファイルがまずつくられてから、(リダイレクト内容をはきだす)コマンドが実行される。