2

したがって、実行時に基本的に次のデータセットを出力する非常に大きなプロジェクトがあります。

x,y,z,?,?

これを削除できるように、これが印刷されている場所を見つけたいです。

std::cout に対して ack-grep を試しましたが、非常に多くのファイルがあります。std::cout と 4 つのコンマを 1 行で検索する方法を知っている人はいますか (つまり、std::cout と 4 つのコンマが行に表示されることは知っていますが、他に何があるかわかりません)。find std::cout と "," のように、これに使用する正規表現がおそらくあると思いましたが、そのうちの 4 つです。

何か案は?

4

2 に答える 2

1

試してみてくださいcout(.*,){4}

コードの書き方によっては、ステートメントを見つけるのが難しい場合があることに注意してください。

char *s="%s,%s,%s,%s";
printf(s,x,y,z,?,?);

また

cout <<
    "x,",
    "y,",
    "z,",
    "?,",
    "?\n";

または任意の数の同様のバリエーション...代わりに、その種類の出力を生成するルーチンを探す方がよい場合があります。(微妙な変化かもしれませんが、すでに持っている文字列をやみくもに探しているだけではありません。)

于 2012-07-10T00:47:01.647 に答える
1

~のアプローチについてほぼ合意した

ack 'cout.+(.+,){4,}' --cpp

は null 文字列に一致するため、一致し.+ないことに注意してください。コンマの間に何かがあることを確認する必要があります。また、検索する C++ ファイルのみを選択するようにフラグを追加しました。.*.*,,,,--cpp


ここで、一致するすべての行を削除したいと言ったので、このソリューションを拡張してそれを行う方法を次に示します。もちろん、何か問題が発生した場合に備えて、すべてのソース コードをバージョン管理しておくか、少なくともバックアップを取っておく必要があります。あなたのコードがどのように見えるか正確にはわかりません。コードがケースで機能することをすべて確認する必要があります。

ack が見つけたすべての行が削除したいものであることがわかった場合は、Perl を使用してそれらの行を削除できます。ack は Perl にあり、Perl 正規表現を使用するため、使用する正規表現は同じです。

ack -f --cpp | xargs perl -i -n -e'print unless /cout.+(.+){4,}/'

ack -f --cpp、ツリー内のすべての C++ ファイルのリストを生成するように ack に指示し、xargs はその Perl コマンド ラインを繰り返し呼び出します。perl の-iオプションは、"Edit file in place" を-n示し、Perl に入力ファイルをループする-eように指示し、各行に対して実行するコマンドを提供します。この場合、正規表現に一致しない限り、読み取った行を表示するように Perl に指示しています。これにより、一致する行が各ファイルから効果的に削除されます。

于 2012-07-10T01:42:34.453 に答える