0

私はこの会社でレガシー C++ プロジェクトを再コンパイルするという使命を持っており、32 ビットの chroot を作成した後、依存関係をコンパイルするなどの退屈な作業をすべて行った後、ほとんどのファイルが標準の例外クラスを使用していることが最終的にわかりました。 「using namespace std」を追加したり、「std::」をプレフィックスとして付けたりしません。

すべてのファイルをバッチで変更するための簡単な sed スクリプトを作成しました。しかし、交換が希望どおりにならない場合があります。私のスクリプトは次のようなものです:

sed -r 's/(catch.*)[^std::](exception)/\1 std::\2/' File.cpp

しかし、それを実行すると、次のような結果が得られます (置換のみを grep します):

}catch std::exception& e){
}catch(const std::exception& e){
}catch(const std::exception& e){

元の行は次のとおりです。

}catch(exception& e){
}catch(const exception& e){
}catch(const exception& e){

したがって、キャッチの後に "(exception" が続くと問題が発生し、(const ...) が続くと正常に動作します

最初の後方参照式の ( を "(catch.*\()" に変更して) に一致させようとすることで、正規表現を少し変更しようとしましたが、それでも機能しません。

誰でも私に手を貸してくれますか?

ありがとう

4

2 に答える 2

1

[^std::]'s''t''d'、またはのいずれでもない単一の文字に一致し、一致する文字は':'置換に戻されません。これが、(文字を失う理由です。また、もっと注意深く見れば、余分なスペースで変更catch(const exceptionされているに違いありません。catch(const  std::exception

あなたはおそらく欲しい:

sed -r 's/(catch.*[^:])(exception)/\1std::\2/' File.cpp
于 2013-01-28T15:54:04.520 に答える
1

、、またはではない単一の文字に一致するため、この[^std::]部分は偽物です。これは、必要なものではありません。代わりに、パーツを含むすべてのインスタンスをスキップします。これは私のために働く: std:std::exception

sed -r '/catch.*std::exception/!s/(catch.*)(exception)/\1 std::\2/' File.cpp
于 2013-01-28T15:57:14.420 に答える