ack / ag / grep可以打印功能名称吗?

时间:2019-06-06 10:59:15

标签: linux search grep ack ag

使用ackag时是否可以打印出现关键字的函数或类名?这是我很长时间以来一直希望得到的。

我认为这将非常棘手,因为不同的编程语言具有不同的封装函数/类的方式。

请注意,我的目标权利是通过C源代码进行搜索,但是我希望使用涵盖更多语言/语法的通用解决方案。

3 个答案:

答案 0 :(得分:2)

正如@Inian所评论的那样,使用ackaggrep很难获得可靠的解决方案,因为他们不了解这些语言的语法。

但是,对于查看C源代码文件的情况,我使用带有ack条件的OR来包含以函数定义开头的行。就我而言,我所有的函数要么返回int,要么什么都不返回。因此,以下代码将打印出函数定义行以及包含KEYWORD的行:

ack 'KEYWORD|^void|^int'

答案 1 :(得分:1)

ack的作者在这里。不,我不知道有什么greplike工具可以理解有关所搜索文本文件的任何信息。人们一直都在要求它,但是我什至从未考虑过实现它。

您说:“我认为这将非常棘手,因为不同的编程语言具有不同的封装函数/类的方式。”你说的没错另外,考虑诸如评论之类的东西

  

/ * void foo()* /

和文字字符串

  

printf(“ void foo()”);

这将对任何搜索工具造成问题。字符串void foo()的两个实例实际上都不是函数声明。

在beyondgrep.com上查看More Tools页面。 cscope之类的内容可能会对您有所帮助。

答案 2 :(得分:1)

尽管您列出的程序当前都没有此功能,但是Git使用基于语言的正则表达式来实现git grep -L(在函数名称中搜索)。 This blog post描述了它是如何工作的。当前的正则表达式列表位于git源代码树here中,可以按照上面的博客中的描述进行扩展。

此外,ctags提供了一种从多种语言的文件枚举标签的通用方法,但是我(尚未)还找到一种将输出与git grep -L集成的方法。