素材の味

丁寧に暮らしています

ターミナルから複数ファイル内の文字列の置換

僕が普段使っているBracketsにはすべてのファイルからの検索はあるけど、置換はない。 だから、複数ファイルの文字列の置換はソフトウェアを使って行っていた。

別に不自由はなかったけど、Windows環境に依存していたからあまり好きではなかった。 そこでターミナルからこの作業ができないかと思った。

最初に見つけたのはfindを使った方法。

find . -name "*.txt" -exec sh -c 'sed -e "s/aaa/bbb/" {} > {}' \;

これを実行すると今いるディレクトリのtxtファイル内のaaaをbbbに置換する。 これでもいいんだけど、すこし理解しづらい。

直接シェルスクリプト書いたほうがわかりやすかった。

sh-3.2$ for file in *.txt
> do
> sed -e "s/aaa/bbb/" $file > $file
> done

これでさっきと同じ処理ができる。

zshだともっと短くてこんなかんじになる。(shとかbashだとエラー)

% for file in *.txt
for> sed -e "s/aaa/bbb/" $file > $file

これならどのOSでも使えるし、覚えやすいから便利。 積極的に使っていく。