0

我一直在使用 grepwith perlextension 进行多行匹配。但是事实证明,所有匹配的行号取决于第一个多行匹配中的行数!

grep查找c函数 start的正则表达式:

   grep -iPn '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'

我可以用一个例子更好地解释:

假设源文件中存在这两个函数

      int f1(int a) {       

      int 
      f2 (int b )        
      {

在这种情况下,grep 成功匹配正则表达式,输出到 stdout 的行号与源文件的行号一致。

当多行函数首先出现时会出现问题。这会改变行号输出,在检查文件一段时间后,我得出了结论。多行函数匹配但被 grep 读取为单行,因此它为整个函数分配一个单行号。函数后面的下一行根据“函数定义开始正则表达式”的行数缩短其行号占据。

我的文件中有许多多行C函数,并且每个函数的行号都太偏离了。

有没有办法纠正这个?

4

2 回答 2

3

对相同的正则表达式使用 pcregrep 会显示正确的行号!

 pcregrep -Mni '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'
于 2012-06-27T16:10:45.817 回答
0

您的解决方案不适用于我的 (linux, gnu) grep。

我需要添加-z以使其工作。用 -z “行”由空字符分隔;这样你就有一个“行”,所以行号不起作用:(但字节偏移量可以。有时这就足够了......

因此,使用 grep:

grep -ziPbo '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'

获得

24:int 
f2 (int b )        
{
于 2015-03-12T19:44:44.337 回答