在搜索字符串的代码时,我经常遇到问题,我变得毫无意义,无上下文的结果。例如,如果一个函数调用分为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。
我确信我可以写点什么,但我知道有人必须已经这样做了。
谢谢!
答案 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)
答案 4 :(得分:0)
我遇到的情况是我有一个xml文件,其中包含xml样式格式的zip文件的名称,也就是说,用胡萝卜包围文件的名称,例如example.zip< \ stuff>
我使用awk将所有胡萝卜更改为新行,然后使用grep:)