2

grep特定の C 関数のすべての呼び出し元を見つけるために使用しようとしています。

例えば:

void foo()
{
  ...
  ret = my_bar()
}

のすべての出現に対してmy_bar()、対応する関数名をどこから呼び出されたかを出力したいmy_bar()

私は試しました(必要な複数行検索の正規表現(grep)に基づく)

grep -Pzo "(?s)^{\N*?.*?my_bar" *.c

Perl 正規表現を使用していますが、これは期待どおりには機能しません。関数の前 foo()から最後まで試合を開始しますmy_bar()

これは grep/perl と regex で可能ですか、または次のようなツールを使用する必要がありますcscopeか?

4

1 に答える 1

0

my_bar()最後の関数を記憶し、見つかったときにその名前を出力する Perl ワンライナー。これは非常に単純化されたもので、関数が複数回呼び出されると複数回出力さmy_bar()れますが、基本的な考え方は理解できます。

perl -ne '$fun = $_ if /^\w+ \w+\(.+\)$/; if (/my_bar\(\)/) { print "$fun" }' *.c

以下のバリアントは、複数行の引数リストと末尾のコメントを持つ関数もカバーする必要があります。

perl -ne '$fun = $_ if /^\w+ \w+\(.+$/; if (/my_bar\(\)/) { print "$fun" }' *.c
于 2013-09-16T07:17:24.840 に答える