2010-04-22 57 views
9

当搜索字符串的代码时,我经常遇到问题,我得到毫无意义的,上下文无关的结果。例如,如果一个函数调用被拆分为3行,并且我搜索参数的名称,那么我自己获取该行的参数,而不是该函数的名称。我该如何grep整个可能包装的代码行?

例如,在含有

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

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

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

谢谢!

+3

不知道,但它是一个很好的问题! – mpen 2010-04-22 04:49:40

+1

代替一个好的解决方案,你总是可以使用grep的'-C n'作为上下文的'n'行 – 2010-04-22 05:08:57

回答

3

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

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

酷,不知何故不知道pcregrep。喜欢使用提示:'用法:pcregrep [-ABCcDdeFfHhilLMNnoqrsuVvwx] [长选项] [模式] [文件]'。总是很高兴知道哪些字符是有效的选项! – Cascabel 2010-04-22 05:10:11

+0

... *是啊,选项膨胀,有什么乐趣。 – 2010-04-22 05:11:42

+0

@wash - 什么选项膨胀???他们仍然有20个字符未使用! – DVK 2010-04-22 05:14:59

1

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

1

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

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,则可以使用“)”上的“分割”应用相同的概念。

0

我有一种情况,我有一个xml文件,里面全是xml样式格式的压缩文件的名称,也就是说,用胡萝卜括起文件的名字,例如。拉链< \东西>

我用awk来改变所有胡萝卜切成换行符然后使用grep的:)