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

Function 在上下文中包含函数名的grep报告,function,grep,git-diff,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

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 report成为匹配的函数上下文,类似于git diff(即,在上述情况下是。@@int myioctl(…)?或者是否有类似于grep的grep替换工具,但也会报告函数上下文

我经常浏览源代码,了解包含匹配行的函数很有帮助,无需打开文件并查找特定的模式或行号


谢谢

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

反正

你有文件名吗

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

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> ) {  
(){
您需要对其进行扩展,以便它能够表示更多形式的函数语句。

您可以使用内置函数,该函数具有显示整个函数的上下文行的选项:

-W
--函数上下文
显示从包含函数名的前一行到下一个函数前一行的周围文本 名称,有效地显示匹配所在的整个函数 找到。函数名的确定方式与git diff相同 计算修补程序大块头(请参见中定义自定义大块头) )


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

我不一定有一个diff或git输出,因为我只是在grepping文本(代码)文件。我只是提供了git diff作为一个工具示例,该工具可以了解代码上下文并提供包含相关“匹配”的函数定义…基于以上答案和其他答案,我猜我应该阅读git diff源代码,并尝试将其合并到grep中……(…感谢您的建议:)@Trevor哦,我完全误解了这个问题。我以为你在使用git diff,它没有提供函数名,所以你想让它这样做。@Trevor无论哪种方式,你都可以让grep输出行号,然后继续我试图提供给你的内容。让我知道你想出了什么。听起来像是一个不错的项目想法。@Trevor我修正了答案,使之与您的问题相匹配。如果您找到了解决方案,只需关闭此问题,它就不会一直出现在“未回答”选项卡中。祝您愉快虽然最初的问题可能不是这个意思,但我发现此脚本对我的案例很有用,谢谢!我做了一次修改来处理多个文件:
grep-n“pattern”YOUR/FILES | sed-r/([a-z|/]+):([0-9]*):./\2\1/”;读取arg时,执行head-n$arg | tac |
…请参见: