私は時々コメントのために間違った肯定を得ることなくソースコードをgrepする方法を検索しました。たとえば、この.cソースコードからfooを検索すると、次のようになります。
/*
* foo has changed [...] and is now a 2-parameters function
*/
// foo(24)
foo(42, 28);
無邪気な人々はgrep
3回の発生に気づくでしょうが、私は1回だけ欲しいです。私は見たこの方法StackOverflowでこれを行いましたが、私の要件には合いません。そのプラットフォームではPHPを使用できません。私もそれに気づいた。この方法一行の説明ですが、私の問題の一部だけを解決します。
古典的なスクリプトツール(awk、sed、bash、grepなど)を使用する必要があります。早く何千ものファイルにもかかわらず。
さて、ソースコードをgrepできるかどうか、そしてソースコードだけをgrepできるかどうか知っていますか?
答え1
grepはプレーンテキストで動作し、Cプログラムの基本的な構文に関する知識はありません。したがって、内部レビューを検索したくない場合は、次のオプションがあります。
検索する前にCコメントを削除するには、次のコマンドを使用してこれを実行できます。
gcc -fpreprocessed -dD -E yourfile.c
詳細については参照https://stackoverflow.com/questions/2394017/remove-comments-from-cc-code詳細については、可能なすべてのC / C ++アノテーションを処理するために見つけたものなど、いくつかの反応スクリプト(
//
またはで始まる行をスキップして動作する/*
)を作成/使用してください(再度、いくつかのひどいテストケースについては前のリンク参照してください)。これはまだ誤検出を引き起こす可能性がありますが、前処理を実行する必要はありません。高度なツールを使用してコードで「意味検索」を実行します。 「coccigrep」が見つかりました。http://home.regit.org/software/coccigrep/これらのツールを使用すると、特定の言語ステートメント(たとえば、特定の名前を持つ構造体の更新)を検索でき、もちろんコメントも削除されます。
答え2
次のように、コメント以外の項目を一致させる簡単なアプローチを試すことができます。
$ egrep -v "^(//|/\*| \*)" sourcecode
これは接頭辞コメントを逆にのみ一致させます。つまり//
、、/*
またはで*
始まる行のみが一致するため、ペアでコメント化されたブロックは*/
見逃されません。/*
*/
答え3
後でこの質問に答える人のために、次の具体的なバリエーションがあります。
ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s
C ソースファイル一覧
ls -1 src/*.c
サブシェルでプリプロセッサを実行するxargsにパイプ
gcc -fpreprocessed -dD -E {} 2>&1
その後、必須のgrepコマンドにパイプされます。
grep -wi -e one -e two -e three -n
次に、各行の前に現在のファイル名を付けてsedにパイプします。
sed 's:^:{}\::'
最後に、catを使用して、繰り返されるすべての空行を1行に縮小します。
cat -s
これはRHEL6システムで動作しますが、他の* nixシステムでは十分に一般的だと思います。