grep検索で「//」を含む結果を省略

grep検索で「//」を含む結果を省略

端末に表示したくないテキストの1行に対して大規模なC ++コードベースを検索しようとしています。約40の異なるファイルを見つけてstd::cout返しました。私が直面している問題は次のとおりです。

  • 私が直接追加したのではなく、どこにいるのかわかりません。
  • メモリ位置のみを出力するポインタなので、検索するコンテキストはありません。
  • コードベースはかなり大きく、かつてsdt::coutデバッグ目的で使用されていましたが、後でコメントアウトされた他の多くのインスタンスが含まれています。

私の質問は最後の質問に関連しています。使っています

grep -rle 'std::cout' .

std::cout検索を実行すると、正の値と実際にコメントアウトされた行の他のすべてのケースが返されます//std::cout// std::coutstd::cout

コメントアウトされた行が削除されるように埋め込まれたgrep行を省略するようにmyをどのように変更できますか?//

答え1

std::cout前に何もない場合にのみ見つけることができます//。正規表現構文には否定は含まれません。各正規表現は補数を作成して否定できますが、補数が非常に大きくなる可能性があります。ここは大きすぎません。

grep -rl -E '^/?([^/]/?)*std::cout' .

すべての発生項目を一覧表示しstd::coutて発生項目をフィルタリングすることも//.*std::coutできますが、これにより次の項目が非表示になりますstd::cout << foo; // std::cout << bar;

grep -r 'std::cout' . | grep -vE '^[^:]*:.*//.*std::cout' | sed -e 's/:.*//'

または、次のようにC ++コードを解析するツールを実行できます。商標

答え2

egrep -r '^([^/]/?)*std::cout' .

答え3

grep -r 'std::cout' . | grep -v '^[ \t]*//'

コメント化された行のみが無視され、すべてのコメント化された行は無視されません。

答え4

再充填するザイルズの答え単一ファイルの場合Sedでは、すべての作業をより簡単に実行できます。

sed -n 'h;s|//.*||;/std::cout/{g;p;}' file.c

つまり、h(前の)行を保存し、末尾のコメントをすべて削除してから、行が目的のパターンと一致する場合は、保存した行のgコピーを設定して印刷します。

しかし、再帰的なgrepの場合は、Gilleのソリューションを使用してください。

関連情報