当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 🙂