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

时间:2010-04-22 04:47:34

标签: linux unix command-line awk grep

在搜索字符串的代码时,我经常遇到问题,我变得毫无意义,无上下文的结果。例如,如果一个函数调用分为3行,并且我搜索参数的名称,我会在一行中获取参数,而不是函数的名称。

例如,在包含

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

对MY_CONSTANT进行grepping将返回如下所示的行:

                    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下完成的任何建议?仅供参考我的首选语言是C和Perl。

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

谢谢!

5 个答案:

答案 0 :(得分:3)

您可以将pcregrep与-M选项一起使用(多行匹配; pcregrep是与Perl兼容的正则表达式的grep)。类似的东西:

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

答案 1 :(得分:3)

以下是使用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,可以在“)”上使用“splitting”来应用相同的概念。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果这不是学术上的努力,你可以使用cscope(仅限C代码)。如果您愿意放弃在评论中搜索的要求ctags应该足够了(并且它也支持Perl)。

答案 4 :(得分:0)

我遇到的情况是我有一个xml文件,其中包含xml样式格式的zip文件的名称,也就是说,用胡萝卜包围文件的名称,例如example.zip< \ stuff>

我使用awk将所有胡萝卜更改为新行,然后使用grep:)