もし、知っている方がいらっしゃいましたら教えてください。
Linux のシェルから使えるツールでお願いいたします。
b shell スクリプトです。
変換したいシンボルと変換後のシンボルは、HOGEHOGE,FUGAFUGA の部分を書き換えてください。
% cat replase.sh #!/bin/sh for i in $* do echo $i sed -e 's/HOGEHOGE/FUGAFUGA/g' $i >__tmp$$ mv __tmp$$ $i done % replase.sh *.cpp
ありがとうございます。 sed を使った実際のコードですね。
シェルスクリプトを書くのが苦手なので、参考にさせていただきます。
ありがとうございます。
GNU GLOBAL ってシンボルの置換も出来るのですか!
知りませんでした。
時間があるときに調べてみたいと思います。
GREP機能があるエディタはどうでしょう?
自分はxyzzyというエディタを使っていますが、それの「Gresreg」という機能が便利です(他のエディタでも似たような機能があるかもしれません)
通常の検索だけでなく、正規表現を使った検索/置換ができますのでかなり細かく絞り込みできます。
http://www.jsdlab.co.jp/~kamei/
置換だけのツールをお探しでしたら「JGREP」が良いかもしれないですね。
http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005053.html
ありがとうございます。
たしかに、エディタの機能を使うというのはいいのですが、
たくさんのファイルを一度に置換したい場合がかなり多いのですよね。
ソースコードの置換は構文解析を含んでいないと不安な処理なのでsedで置換するなら
まずgrepで一覧を作って手作業で確認を行った後にsedで置換するスクリプトを書いたほうがいいと思います。
回答の条件としてあげられている「Linux のシェルから使えるツール」というのが
たくさんのファイルを一度に置換したいという理由からなら
IDEなどについているリファクタリングツールを使ったほうが確実で安心だと思います。
わたしは普段はVisualStudioの機能を使っているので、Linuxのリファクタリングツールには詳しくないですが、
こちらのエントリーではXrefactoryというC++リファクタリングツールをemacsから使う方法が紹介されています。
http://d.hatena.ne.jp/higepon/20060727/1153987269
Linuxのシェルから使えるリファクタリングツールは知らないですが、
気になったので書き込ませていただきました。
ありがとうございます。
まず、先に grep で一覧を作るというのは sed を使うときの安全策としてはよさそうですね
そうですね。
Linux でも Visual Studio のようなリファクタリングツールがあると一番うれしいですね。
Xrefactory を少し調べてみたいと思います。
私の場合、コマンドラインから一気にやるなら zsh+perl で
perl -i.bak -ple "s/oldsymbol/newsymbol/g" ./**/*.{cpp,h}
とかやってます。
目で見て確認しながら置換したい場合は、emacs 上で moccur-grep-find+moccur-edit を使います。
ありがとうございます。
zsh だと以下のような書き方ができるのですね。
./**/*.{cpp,h}
perl の正規表現ほうが sed よりも慣れているのでいいかもしれません。
自分はよく Vim のマクロを使いますね。複数行にまたがる置換も一気にできるのが便利です。
ファイルがあまりに多い場合は、sed で正規表現にかけます。さいしょちゃんとマッチするかを試したあとは、 find + sed -i でずばばばっと。
凝ったことがやりたいときは Ruby でワンライナー、というときもありますね。
ありがとうございます。
Vim 使ってますがマクロをぜんぜん使いこなしていないので、調べてみたいと思います!
やはり、みなさん sed 使ってるんですね。
find . -name '*.txt' -exec perl -i.bak -pe "s/hoge/foo/g" \{\} \;
・・・とかはいかがでしょうか。カレントディレクトリ以下を再帰的に置換する一行スクリプト、という感じです。
正規表現がある程度扱える必要がありますが・・。
ありがとうございます。
perl + find ですね。
find ってファイルをまたがって何かのコマンドを適用したいときに便利ですね。
自分ならperlワンライナでバックアップもとりつつこんな感じでしょうか。
$ perl -i.bak -pe 's/\b(hoge)\b/fuga/g' *.cpp tmp/*cpp
もっと大量のファイルを処理するならfindとxargs使います。
$ find . -name *.cpp | xargs perl -i.bak -pe 's/\b(hoge)\b/fuga/g'
正規表現とかこれでいいのかな?
まぁそのへんはamachangのほうが詳しそうだからだいじょうぶかー。
(動作確認テキトウ)
ありがとうございます。
-i.bak ってのはバックアップのことだったんですね!
知りませんでした。勉強になりました!
やりたいことがリファクタリングであればNetBeansを、と思ったのですがシェルからなんですね。
C/C++もだいぶちゃんとリファクタリングができるようになってます。
ありがとうございます。
NetBeans って Java だけのツールかと思ってました!
すでにいくつか例が挙がっていますが、シェルスクリプトのワンライナーです。
e.g. find . -type f -name '*.cpp' | while read f; do echo $f mv $f $f.bak && sed -f _ $f.bak > $f done | tee -a $$.log
sedの-fオプションの引数には、正規表現を書き連ねたファイルを指定します。
上の例で言えば、 '_'という名前のファイルに、以下のようにして複数の正規
表現を書いておきます。
e.g. cat << 'EOF' > _ s/FOO/BAR/g ... EOF
後方参照を利用するような複雑な置換を行う場合、自分ならやはり sedを選択
すると思います。いずれしても、最後は正規表現でどうパターンマッチさせる
かが重要になってきますね。
細かい解説ありがとうございます!
とても勉強になります。
ありがとうございます。
sed ですね。
あまり使ったことがないのですが、多少誤変換が怖い感じがします。
杞憂でしょうか。
単語の境界を指定すれば以外と誤変換は少ないのかもしれませんね。