2011-07-29 15 views
1

私はC++のユーザーで、.at()を使用してSTLベクタをチェックするコードをいくつか持っています。今度は標準[]に変更したいと思います。誰もがこれを行うことができるスクリプトを知っていますか?それはスーパーの一般的なスクリプトである必要はありません - ケースのほとんどは.at(i)またはおそらく.at(a*i+j)です - しかし手で行うには余りにも多くがあります。私のコード全体で.at()を[]に置き換える

+1

'、\。at(i \)、\ [i \]、g'の何が問題なのですか? –

+1

これは、単一の変数名でのみ機能します。彼はおそらく、後方参照を使用するものを望んでいます。 –

+1

なぜこれをやりたいですか?パフォーマンスの改善のためには、変換前と変換後でそれを確認してください。差が20%未満であれば、変更を元に戻すことをお勧めします –

答えて

6

はこのPerlの演算子を使用します。Perlで

s/\.at\(([^)]+)\)/[$1]/g 

s///オペレータは、 "代替"(検索/置換)です。 //の最初のセットでは、一致させる正規表現を指定します。 2番目の//はそのマッチを置換するか置換するテキストです。

この場合、私は ".at(何でも近づくことはできません)"のインスタンスを見つけて、 "[それらの括約物]"と置き換えます。ワンライナーとして

perl -pe's/\.at\(([^)]+)\)/[$1]/g' in.cpp > out.cpp 

は、Visual Studioのを使用する場合は、検索/置換プロンプトで次の操作を行います。

何を検索:\.at\({[^)]+}\) はと交換してください:\[\1\]

正規表現を有効にしておきましょう。

+0

s ///の使い方を追加しても構わないと思いますが。 – ikegami

+0

いいえ、ありがとう。答えを改善することは決して問題ではありません。 – kevlar1818

1
sed -i 's,\.at(\([^\)]*\)),[\1],g' *.h *.cpp 

は、ほとんどの簡単な式で使用できます。しかし、at()へのパラメータ内でかっこを使用すると、これは機能しません。

grep 'at(.*).*)' *.h *.cpp 

は、これらのケースを特定し、ランニングはsedスクリプト言っ 前にそれらを変換するのに役立ちます。

P.S. sedをここのようにインプレースで動作させる場合は、バックアップを(たとえばVCS経由で)行います。

編集:投稿する前にsedスクリプトをテストしておく必要があります。今すぐ修正され、テストされました。