Grep:查找调用函数的函数

时间:2015-01-19 16:05:51

标签: regex linux command-line grep

我们说我有一个包含大量模块的文件夹,我正在为一个函数执行grep。让我们说我搜索的功能称为test()。是否有可能找出调用哪个函数test()?例如,让我们在下面说ModuleA.erl,我们为test()做一个grep。

FunctionA()
   A = 5, 
   B = 3,
   test()

它应该返回:

ModuleA.erl: FunctionA()

可以安全地假设函数定义将始终为非缩进

2 个答案:

答案 0 :(得分:3)

您可以使用awk

$ awk -v patt="test" '$0 ~ /^\w/ {f=$0} $0 ~ patt {print f}' file
FunctionA()

解释

这会存储不以空格开头的行。如果一行匹配,则打印最后存储的行。

  • -v patt="test"提供模式
  • $0 ~ /^\w/ {f=$0}如果当前行以某个字符(不是空格)开头,则存储其值。
  • $0 ~ patt {print f}如果一行包含给定的模式,则打印存储的标题。

测试

$ cat a
FunctionA()
   A = 5, 
   B = 3,
   test()
FunctionB()
   A = 5, 
   B = 3,
   another()
$ awk -v patt="test" '$0 ~ /^\w/ {f=$0} $0 ~ patt {print f}' a
FunctionA()

答案 1 :(得分:1)

只需在存储.erl文件的目录上运行以下grep命令。

grep -HPoz '^\S.*(?=(\n .*)+test\(\))' *.erl

来自man grep

-H, --with-filename       print the file name for each match
-P, --perl-regexp         PATTERN is a Perl regular expression
-z, --null-data           a data line ends in 0 byte, not newline

^声称我们刚开始。 \S匹配任何非空格字符。.*匹配任何字符,但不匹配换行符,零次或多次。 (?=(\n .*)+test\(\))肯定前瞻性断言,断言匹配必须后跟

  • \n .*新行字符和空格后跟任意数量的字符,

  • (\n .*)+一次或多次。

  • test\(\)并且必须有test()字符串。只有满足此条件才会发生匹配。

<强>测试

Folder$ cat gi.erl
FunctionA()
       A = 5, 
       B = 3,

FunctionB()
       A = 5, 
       B = 3,
       test()
Folder$ cat ri.erl
FunctionA()
   A = 5, 
   B = 3,
   test()
FunctionB()
   A = 5, 
   B = 3,
Folder$ grep -HPoz '^\S.*(?=(\n .*)+test\(\))' *.erl
gi.erl:FunctionB()
ri.erl:FunctionA()

此处Folder是存储所有erl个文件的文件夹名称。