3

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 但也会报告函数上下文?

我经常 grep 通过源代码,知道包含匹配行的函数很有帮助,而无需打开文件并查找特定的模式或行号。

谢谢!

4

2 回答 2

2

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

反正

所以,你有文件名

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

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> ) {  

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

于 2013-06-20T23:12:26.900 回答
0

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

-W
--function-context
显示从包含函数名称的前一行到下一个函数名称之前的周围文本,有效地显示找到匹配项的整个函数。函数名称的确定方式与 git diff 计算补丁块头的方式相同(请参阅在 gitattributes[5]中定义自定义块头)。

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

于 2021-04-04T02:24:02.937 回答