如何计算Perl

时间:2018-01-12 16:21:45

标签: regex perl pcre

我有一个Perl命令,我拼凑在一起运行正则表达式查找和替换文件。它的效果很好,但有一个令人遗憾的副作用,即修改"即使生成的文件相同,该文件也是如此。这是有道理的,因为它正在用自己替换匹配。我们不能这样做,因为结果是make管道的一部分,并且每次运行都会导致整个重建。

我现在想运行一个命令来获取特定命名捕获组的匹配计数,这样我就可以在实际运行第一个命令之前测试是否需要替换任何内容。

该命令通过bash执行,带有一些bash变量:perl -0777 -i -pe '$cnt=0;s{('$PASSTHROUGH'|'$REPLACE')}{$+{PASSTHROUGH}?$+{PASSTHROUGH}:(++$cnt,'$REPLACEMENT')")}peg; END{print "$cnt\n"}'

同样,这很有用,并且为我提供了实际替换的数量,因为$cnt仅在三元运算符的else分支中递增。如果我仅针对$REPLACE模式运行匹配,则无法获得正确的数字,因为它通常会匹配$PASSTHROUGH组中的内容。

我怀疑有一种方法可以检索特定群组的计数,但我不知道Perl或术语,所以我很难找到如何将此命令更改为的答案不进行替换,而只是简单地将匹配计数到$REPLACE子模式。它是一个命名组:(?<REPLACE>some-regex-pattern)

1 个答案:

答案 0 :(得分:3)

问题更新后编辑

  • -0777表示整个文件被读取一次(输入记录分隔符undef)
  • -i:编辑文件inplace(如sed -i),必须删除以避免修改文件
  • -p:打印行

以下命令应该只打印匹配数

perl -0777 -ne '$cnt=@a=m{('$PASSTHROUGH'(*SKIP)(?!)|'$REPLACE')}pg;print "$cnt\n"'

它以不同的方式完成:

  • 模式交替的原则是先匹配不能保持我们想要的东西
  • (*SKIP):是一个回溯控制动词,可防止正则表达式引擎在匹配失败后回溯,这就是正常情况。
  • (?!):与(*FAIL)
  • 相同