複数の C++ のソースファイルに対して、一度にシンボルの置換をかけられるツールを探しています。

もし、知っている方がいらっしゃいましたら教えてください。
Linux のシェルから使えるツールでお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/11/24 17:33:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答12件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント200pt

標準コマンドの sed と for を組み合わせてみてはどうでしょう。

id:amachang

ありがとうございます。

sed ですね。

あまり使ったことがないのですが、多少誤変換が怖い感じがします。

杞憂でしょうか。

単語の境界を指定すれば以外と誤変換は少ないのかもしれませんね。

2008/11/19 13:57:26
id:zzz_1980 No.2

回答回数492ベストアンサー獲得回数64

ポイント200pt

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
id:amachang

ありがとうございます。 sed を使った実際のコードですね。

シェルスクリプトを書くのが苦手なので、参考にさせていただきます。

2008/11/19 14:04:00
id:buri17 No.3

回答回数1ベストアンサー獲得回数0

ポイント200pt

はずしてるかもしれませんが、GNU globalではだめですか?

http://www.gnu.org/software/global/

id:amachang

ありがとうございます。

GNU GLOBAL ってシンボルの置換も出来るのですか!

知りませんでした。

時間があるときに調べてみたいと思います。

2008/11/19 14:21:58
id:YOSIZO No.4

回答回数64ベストアンサー獲得回数1

ポイント200pt

GREP機能があるエディタはどうでしょう?

自分はxyzzyというエディタを使っていますが、それの「Gresreg」という機能が便利です(他のエディタでも似たような機能があるかもしれません)

通常の検索だけでなく、正規表現を使った検索/置換ができますのでかなり細かく絞り込みできます。

http://www.jsdlab.co.jp/~kamei/


置換だけのツールをお探しでしたら「JGREP」が良いかもしれないですね。

http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005053.html

id:amachang

ありがとうございます。

たしかに、エディタの機能を使うというのはいいのですが、

たくさんのファイルを一度に置換したい場合がかなり多いのですよね。

2008/11/19 17:14:24
id:ultraist No.5

回答回数6ベストアンサー獲得回数0

ポイント200pt

ソースコードの置換は構文解析を含んでいないと不安な処理なのでsedで置換するなら

まずgrepで一覧を作って手作業で確認を行った後にsedで置換するスクリプトを書いたほうがいいと思います。

回答の条件としてあげられている「Linux のシェルから使えるツール」というのが

たくさんのファイルを一度に置換したいという理由からなら

IDEなどについているリファクタリングツールを使ったほうが確実で安心だと思います。

わたしは普段はVisualStudioの機能を使っているので、Linuxのリファクタリングツールには詳しくないですが、

こちらのエントリーではXrefactoryというC++リファクタリングツールをemacsから使う方法が紹介されています。

http://d.hatena.ne.jp/higepon/20060727/1153987269

Linuxのシェルから使えるリファクタリングツールは知らないですが、

気になったので書き込ませていただきました。

id:amachang

ありがとうございます。

まず、先に grep で一覧を作るというのは sed を使うときの安全策としてはよさそうですね

そうですね。

Linux でも Visual Studio のようなリファクタリングツールがあると一番うれしいですね。

Xrefactory を少し調べてみたいと思います。

2008/11/21 09:00:30
id:valda No.6

回答回数1ベストアンサー獲得回数0

ポイント200pt

私の場合、コマンドラインから一気にやるなら zsh+perl で

perl -i.bak -ple "s/oldsymbol/newsymbol/g" ./**/*.{cpp,h}

とかやってます。

目で見て確認しながら置換したい場合は、emacs 上で moccur-grep-find+moccur-edit を使います。

id:amachang

ありがとうございます。

zsh だと以下のような書き方ができるのですね。

./**/*.{cpp,h}

perl の正規表現ほうが sed よりも慣れているのでいいかもしれません。

2008/11/21 09:02:51
id:moira No.7

回答回数2ベストアンサー獲得回数0

ポイント200pt

自分はよく Vim のマクロを使いますね。複数行にまたがる置換も一気にできるのが便利です。

ファイルがあまりに多い場合は、sed で正規表現にかけます。さいしょちゃんとマッチするかを試したあとは、 find + sed -i でずばばばっと。

凝ったことがやりたいときは Ruby でワンライナー、というときもありますね。

id:amachang

ありがとうございます。

Vim 使ってますがマクロをぜんぜん使いこなしていないので、調べてみたいと思います!

やはり、みなさん sed 使ってるんですね。

2008/11/21 09:05:20
id:toohigh No.8

回答回数291ベストアンサー獲得回数37

ポイント200pt

find . -name '*.txt' -exec perl -i.bak -pe "s/hoge/foo/g" \{\} \;

・・・とかはいかがでしょうか。カレントディレクトリ以下を再帰的に置換する一行スクリプト、という感じです。

正規表現がある程度扱える必要がありますが・・。

id:amachang

ありがとうございます。

perl + find ですね。

find ってファイルをまたがって何かのコマンドを適用したいときに便利ですね。

2008/11/21 09:06:55
id:mikeda No.9

回答回数1ベストアンサー獲得回数0

ポイント200pt

自分なら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のほうが詳しそうだからだいじょうぶかー。

(動作確認テキトウ)

id:amachang

ありがとうございます。

-i.bak ってのはバックアップのことだったんですね!

知りませんでした。勉強になりました!

2008/11/21 09:08:29
id:hakutoitoi No.10

回答回数1ベストアンサー獲得回数0

ポイント200pt

perlです。

perl -i.org -p -e 's/fuga/hoge/g' *.cc
id:amachang

ありがとうございます。

perl 派が多いですね!

2008/11/21 09:09:10
id:nowokay No.11

回答回数2ベストアンサー獲得回数1

ポイント200pt

やりたいことがリファクタリングであればNetBeansを、と思ったのですがシェルからなんですね。

C/C++もだいぶちゃんとリファクタリングができるようになってます。

id:amachang

ありがとうございます。

NetBeans って Java だけのツールかと思ってました!

2008/11/21 17:16:18
id:silverwire No.12

回答回数3ベストアンサー獲得回数0

ポイント200pt

すでにいくつか例が挙がっていますが、シェルスクリプトのワンライナーです。

  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を選択

すると思います。いずれしても、最後は正規表現でどうパターンマッチさせる

かが重要になってきますね。

id:amachang

細かい解説ありがとうございます!

とても勉強になります。

2008/11/21 17:17:45

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • IT戦記 - 質問した 2008-11-19 13:46:33
    質問した 複数の C++ のソースファイルに対して、一度にシンボルの置換をかけられるツールを探しています。 もし、知っている方がいらっしゃいましたら教えてください。 Linux のシ.. - 人
  • 複数ファイルを一気に置換 - 質問した - IT戦記 複数の C++ のソースファイルに対して、一度にシンボルの置換をかけられるツールを探しています。 もし、知っている方がいらっしゃいまし
  • C/C++のシンボル置換 http://q.hatena.ne.jp/1227069551 ボクも昔、同じようなことがやりたかったことがあります。 で、そのときはよくよく考えるとソースコードのシンボルを置換しなくても、最終
  • amachangの質問に答えたー http://q.hatena.ne.jp/1227069551#a872439:title=複数の C++ のソースファイルに対して、一度にシンボルの置換をかけられるツールを探しています。 もし、知っている方がいらっ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません