端末に表示したくないテキストの1行に対して大規模なC ++コードベースを検索しようとしています。約40の異なるファイルを見つけてstd::cout
返しました。私が直面している問題は次のとおりです。
- 私が直接追加したのではなく、どこにいるのかわかりません。
- メモリ位置のみを出力するポインタなので、検索するコンテキストはありません。
- コードベースはかなり大きく、かつて
sdt::cout
デバッグ目的で使用されていましたが、後でコメントアウトされた他の多くのインスタンスが含まれています。
私の質問は最後の質問に関連しています。使っています
grep -rle 'std::cout' .
std::cout
検索を実行すると、正の値と実際にコメントアウトされた行の他のすべてのケースが返されます//std::cout
。// std::cout
std::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のソリューションを使用してください。