ファイルの文字列置換
- ref:某日記(中期)
複数のファイルの特定文字列を一括変換したい場合、
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、まあ、やめておいたほうがよさげ。
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 されたファイルになったりした