ファイルの文字列置換

複数のファイルの特定文字列を一括変換したい場合、

for i in *; do cat < "$i" | sed 's/AAA/BBB/' > "$i"; done

とすると良さそうに見えるけど、これってポータブルなのかねぇ。

tee を使って標準出力は /dev/null に捨てるとか。

for i in *; do sed 's/AAA/BBB/' < "$i" | tee "$i > /dev/null; done

と思ったけど、良く考えるとこれも本質的なところでは変わらない。
Linux だと cat の変わりに perl -ne 'print; sleep 1' とかにしてみると良く分からない挙動になるので*1、まあ、やめておいたほうがよさげ。

GNUsed だと

for i in *; do sed -i -e 's/AAA/BBB/' "$i"; done

でいいらしい。なんて軟弱な!

それなら Perl

perl -pi -e 's/AAA/BBB/' *

とやるというソリューション。ファイルが多くて exec の制限に引っかかる場合は適当に for なり find & xargs を活用。
いや、正直なところ GNU sed よか Perl のほうがインストールされている確率高いんじゃないかなぁ、と。
どうでもいいけど、 sed 's/AAA/BBB/g' と g つけなくていいのかなぁ、とか思ったり。

*1:なんか空ファイルになったり zero fill されたファイルになったりした