4

「vector」型のすべての変数を「std::vector」に変更する必要がある大規模なC++コードベースをクリーンアップしています。コード内の#includeとコメントをスキップします。そして最も重要なことは、式がすでに「std :: vector」として記述されている場合は、それを「std :: std::vector」に変換しないでください。

あれは:

#include <vector>
vector<Foo> foolist;
typedef vector<Foo> FooListType;
std::vector<Foo> otherfoolist;
int main()
{
    // this vector is for iteration
    for (vector <Foo>::iterator itor = foo.begin...)

に変換します

#include <vector>
std::vector<Foo> foolist;
typedef std::vector<Foo> FooListType;
std::vector<Foo> otherfoolist;
int main()
{
    // this vector is for iteration
    for (std::vector<Foo>::iterator itor = foo.begin...)

これまでのところ、これを2つのsedコマンドに絞り込んでいます

sed -r 's/vector\s{0,1}</std::vector</g' < codefile > tmpfile
sed 's/std::std/std/' < tmpfile > codefile

最初のsedは「vector<」と「vector<」に一致し、どちらかを「std ::vector<」に変換します。

2番目のsedは、「std ::vector<」を「std::std ::vector<」に変換する副作用を修正します。

上記の2つの異なる正規表現をマージして、コードを正しく修正する単一のsedコマンドを作成するにはどうすればよいですか。

先読みと後読みについてオンラインで読んでみましたが、目が燃え始めています。

4

3 に答える 3

3

std::を使用して、最初の正規表現も一致させることができます

sed -r 's/[std:]*vector\s{0,1}</std::vector</' < codefile > tmpfile

-iところで:コマンドラインパラメータとしてファイルを追加して渡すだけで、その場で変更を加えることができます。

sed -i -r 's/[std:]*vector\s{0,1}</std::vector</' codefile
于 2012-07-13T04:34:30.090 に答える
2

これはあなたのために働くかもしれません(GNU sed):

sed -i 's/\(^\|[^<:]\)\(vector\s*<\)/\1std::\2/g' file
于 2012-07-13T05:50:12.693 に答える
1

sedバージョンが拡張正規表現をサポートしていない場合は、perlを使用できます。

perl -lane ' if (!/^\s*#include/) {s!(?:std::)?vector!std::vector!g;} print; ' < codefile > tmpfile

これは、次のような場合に機能します。 vector<vector<Foo>> otherfoolist;

この回答も参照してください:https ://stackoverflow.com/a/6157705/390913

于 2012-07-13T04:51:11.553 に答える