コメントをキャッチせずにソースコードをgrepする方法


10

私は、コメントのために誤検知を起こすことなく、ソースコードをgrepする方法を探しています。たとえば、この.cソースコードでfooを検索すると、次のようになります。

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

ナイーブgrepは、私が1つだけ欲しい3つのオカレンスを見つけます。StackOverflowでこれを行うこの方法を見てきましたが、私のニーズを満たしていません。PHPはプラットフォームで使用できません。私はまた、1行コメントに対してこの方法を見つけましたが、それは私の問題の一部しか解決しません。

古典的なスクリプトツール(awk、sed、bash、grepなど)を使用する必要があり、数千のファイルがある場合でも高速である必要があります。

ソースコードでgrepを実行することが可能で、ソースコードのみである場合はどうしますか?


3
あなたが何をしているのかに応じて、タグテーブルを構築することはより良いアプローチかもしれません。
Gilles「SO-悪をやめなさい」

回答:


10

次のような非コメントと一致する単純なアプローチを試すことができます。

 $ egrep -v "^(//|/\*| \*)" sourcecode

接頭辞のコメントに対して、この意志だけ逆のマッチ-ラインは、どちらかで始まるである///**または*/ので、それがでコメントアウトされているブロックアウト放置しないだろう- /**/のペアを。


インデントされたコメントで機能するように少し変更:$ egrep -v "^ [[:space:]] *((// | / * | *)" sourcecode
mbonness

11

grepは純粋なテキストで機能し、Cプログラムの基本的な構文については何も知りません。したがって、コメント内を検索しないようにするには、いくつかのオプションがあります。

  1. 検索の前にCコメントを削除します。これを使用してこれを行うことができますgcc -fpreprocessed -dD -E yourfile.c。詳細については、https://stackoverflow.com/questions/2394017/remove-comments-from-cc-codeを参照してください。

  2. すべての可能なC / C ++コメントの詳細を処理するために、すでに見つけたようなハックなハーフワーキングスクリプト(//または/*、で始まる行をスキップすることによって機能する)を記述/使用します(ここでも、恐ろしいテストケースについては前のリンクを参照してください) 。その後、まだ誤検知がある可能性がありますが、前処理を行う必要はありません。

  3. コードで「セマンティック検索」を行うには、より高度なツールを使用します。「coccigrep」を見つけました:http ://home.regit.org/software/coccigrep/ この種類のツールを使用すると、特定の言語ステートメント(特定の名前の構造の更新など)を検索でき、確実にコメントが削除されます。


1

ここに、この質問に遅れて来た私たちの残りの全員のための特定のバリエーションがあります:

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システムでは十分に一般的であると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.