コメントをキャプチャせずにソースコードを把握する方法

コメントをキャプチャせずにソースコードを把握する方法

私は時々コメントのために間違った肯定を得ることなくソースコードをgrepする方法を検索しました。たとえば、この.cソースコードからfooを検索すると、次のようになります。

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

無邪気な人々はgrep3回の発生に気づくでしょうが、私は1回だけ欲しいです。私は見たこの方法StackOverflowでこれを行いましたが、私の要件には合いません。そのプラットフォームではPHPを使用できません。私もそれに気づいた。この方法一行の説明ですが、私の問題の一部だけを解決します。

古典的なスクリプトツール(awk、sed、bash、grepなど)を使用する必要があります。早く何千ものファイルにもかかわらず。

さて、ソースコードをgrepできるかどうか、そしてソースコードだけをgrepできるかどうか知っていますか?

答え1

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/これらのツールを使用すると、特定の言語ステートメント(たとえば、特定の名前を持つ構造体の更新)を検索でき、もちろんコメントも削除されます。

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

関連情報