我如何grep整个,可能包装,代码行?

当searchstring的代码时,我经常遇到这样的问题:我得到的是没有意义的上下文结果。 例如,如果一个函数调用被分成三行,并且我search一个参数的名字,那么我得到的是一行的参数,而不是函数的名字。

例如,在一个文件中包含

... someFunctionCall ("test", MY_CONSTANT, (some *really) - long / expression); 

grep for MY_CONSTANT会返回一个如下所示的行:

  MY_CONSTANT, 

同样,在注释块中:

 ///////////////////////////////////////// // FIXMESOON, do..while is the wrong choice here, because // it makes the wrong thing happen ///////////////////////////////////////// 

对FIXMESOON进行清理给出了非常令人沮丧的答案:

 // FIXMESOON, do..while is the wrong choice here, because 

当有成千上万的命中时,单行结果是没有意义的。 我想要做的就是让grep知道源代码行的起点和终点,就像考虑“;”一样简单。 因为线路分隔将是一个好的开始。

如果点击在评论中,则可以使其返回整个评论块。

我知道你不能单独使用grep来做这件事。 我也意识到可以让grep返回一定数量的上下文。 任何有关如何在Linux下完成的build议? 仅供参考我的首选语言是C和Perl。

我确信我可以写点东西,但是我知道有人必须已经这样做了。

谢谢!

您可以使用带-M选项的pcregrep(多行匹配; pcregrep是带Perl兼容的正则表达式的grep)。 就像是:

 pcregrep -M ";*\R*.*thingtosearchfor*\R*.*;.*" 

这里是一个使用awk的例子。

 $ cat file blah1 blah2 function1 ("test", MY_CONSTANT, (some *really) - long / expression); function2( one , two ) blah3 blah4 $ awk -vRS=")" '/function1/{gsub(".*function1","function1");print $0RT}' file function1 ("test", MY_CONSTANT, (some *really) 

背后的概念:RS是记录分隔符。 通过设置为“)”,那么文件中的每个记录都由“)”分隔,而不是换行符。 这可以很容易地找到你的“function1”,因为你可以“grep”它。 如果您不使用awk,则可以使用“)”上的“分割”应用相同的概念。

您可以使用grep编写一个命令行,其中提供了行号和文件名,然后将这些结果xarg解析为awk来解析这些列,然后使用一个脚本来显示该行周围的N行? 🙂

如果这不是一个学术的努力,你可以使用cscope (仅用于C代码)。 如果你愿意放弃在搜索注释ctags的要求应该是足够的(它也支持Perl)。

我有一个情况,我有一个xml文件充满了XML格式的压缩文件的名称,也就是说,用胡萝卜包围文件的名称,例如example.zip <\ stuff>

我用awk把所有的胡萝卜换成换行符,然后用grep 🙂