多行grep -P [Perl扩展名]匹配错误的行号

时间:2012-06-27 15:34:46

标签: perl sed awk grep pcre

我一直在使用带有grep扩展名的perl进行多行匹配。但是,事实证明所有匹配的行号取决于第一个多行匹配中的行数!

找到grep函数的c正则表达式开始:

   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函数,并且每个函数的行号都有偏差。

有没有办法纠正这个?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

您的解决方案无法使用我的(linux,gnu)grep。

我需要添加-z才能使其正常运行。使用-z" line"由null char分隔;这样你就有一个"线",所以行号不起作用:(但是字节偏移呢。有时这就够了......

所以,使用grep:

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

获得

24:int 
f2 (int b )        
{