grep报告在上下文中包含函数名称

时间:2012-10-10 15:28:39

标签: function grep git-diff

git-diff报告包含更改的直接函数名称,如下所示:

$ git diff
diff --git a/apps/cli/elmo.py b/apps/cli/elmo.py
index ac056e9..1b7c1d0 100644
--- a/myfile.c
+++ b/myfile.c
@@ -100,12 +106,20 @@ int myioctl(unsigned int cmd, int size, int direction, unsigned long arg
                rc = myfunc1(ioargp);
                break;

-       case IOCTL_1:
-               rc = myfunc1(ioargp);
+       case IOCTL_2:
+               rc = myfunc2(arg);
                break;

有没有办法让grep报告匹配的函数上下文,类似于git-diff(即上例中的@@ int myioctl(...))?或者是否有一些grep的替换工具,其行为类似于grep,但也会报告函数上下文?

我经常浏览源代码,知道包含匹配行的函数是有帮助的,而不必打开文件并查找特定的模式或行号。

谢谢!

2 个答案:

答案 0 :(得分:1)

这不完全可行,因为我认为你不能用正则表达式表示所有形式的函数语句。你需要一个语法。

无论如何

所以,你有文件名

现在你需要找出匹配发生的行号。

grep -n "pattern" MYFILE | sed -r 's/([0-9]*):.*/\1/'

您想知道上面打印的行是什么函数

grep -n "pattern" MYFILE | sed -r 's/([0-9]*):.*/\1/' | while read lineNo
do
    head -n $lineNo MYFILE | tac | egrep -m 1 "[[:alnum:]]+[[:space:]]+[[:alnum:]](.*)[[:space:]]*{"
done

这将为您提供包含发生匹配的行的函数名称(希望如此) (我正在使用 egrep ,因此我可以使用'+'运算符。)

请注意,此模式与函数声明匹配,如下所示:

<function-type> <function-identifier> ( <things> ) {  

您需要对其进行扩展,以便它可以表示更多形式的函数语句。

答案 1 :(得分:0)

您可以使用内置的 git-grep,它可以选择显示整个函数的上下文行:

<块引用>

-W
--function-context
显示从包含函数名称的上一行到下一个函数之前的文本 名称,有效地显示了匹配的整个函数 成立。函数名称的确定方式与 git diff 相同 制定补丁大块头(参见定义自定义大块头 gitattributes[5]).

示例:git grep -W 'myioctl' -- path/to/myfile.c