我们说我有一个包含大量模块的文件夹,我正在为一个函数执行grep
。让我们说我搜索的功能称为test()
。是否有可能找出调用哪个函数test()
?例如,让我们在下面说ModuleA.erl
,我们为test()
做一个grep。
FunctionA()
A = 5,
B = 3,
test()
它应该返回:
ModuleA.erl: FunctionA()
可以安全地假设函数定义将始终为非缩进
答案 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
个文件的文件夹名称。