【问题标题】:Wrong line numbers with multiline grep -P [ Perl extension ] match多行 grep -P [ Perl extension ] 匹配的错误行号
【发布时间】:2012-06-29 02:31:32
【问题描述】:

我一直在使用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 函数,而且每个函数的行号都相差太大。

有没有办法纠正这个问题?

【问题讨论】:

  • 在匹配之前将整个文件读入内存的解决方案是否可以接受?换句话说,您的输入文件不是很大吗?我假设 C 源文件的大小是合理的。如果我们能做到这一点,那就更容易了。
  • 是的,尺寸合理,但总有一个限制。正如您提到的“这样”,但是哪个?

标签: perl sed awk grep pcre


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    所以,使用 grep:

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

    获得

    24:int 
    f2 (int b )        
    {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2013-11-28
      • 2020-08-13
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多