読者です 読者をやめる 読者になる 読者になる

amachangの質問に答えたー

複数の C++ のソースファイルに対して、一度にシンボルの置換をかけられるツールを探しています。もし、知っている方がいらっしゃいましたら教えてください。Linux のシェルから使えるツールでお願いいたします。


perlワンライナで返答してみた。

$ perl -i.bak -pe 's/\bhoge\b/fuga/g' *.cpp tmp/*.cpp
$ find . -name *.cpp | xargs perl -i.bak -pe 's/\bhoge\b/fuga/g'


他の人はワード境界を意識してないようなので投稿した意義はあったかな。amachangはもっとちゃんとしたツール探してたんだろうけど。
$ sed -i.bak s/hoge/fuga/g main.cpp
だと「hoge」だけじゃなく「hoge_num」や「p_hoge」も部分的に書き換えられる。それを意図するにしても何が置換されたか確認するコマンドも実行しておかないとちょっと怖いなと思う。


\bはワード境界にマッチする正規表現。行頭、行末を示す^や$と同じようにそれ自体はマッチする文字を持たず、ワード形成文字(\w英数字とアンダースコア)とそれ意外の文字(\w)の間にマッチする。
(iオプションは出力結果で対象ファイルを置換し、同時に-i直後に指定したプレフィックスでオリジナルファイルのバックアップを取る、というややこしいオプション。)


追記
コメント、文字列の中については対象外する必要があるか。
Effective Perl (ASCII Addison Wesley Programming Series)にコメント部分にマッチさせる正規表現のってて、めんどくせ・・・とスルーした記憶が。