我有一个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)
答案 0 :(得分:3)
问题更新后编辑
-0777
表示整个文件被读取一次(输入记录分隔符undef)-i
:编辑文件inplace(如sed -i),必须删除以避免修改文件-p
:打印行以下命令应该只打印匹配数
perl -0777 -ne '$cnt=@a=m{('$PASSTHROUGH'(*SKIP)(?!)|'$REPLACE')}pg;print "$cnt\n"'
它以不同的方式完成:
(*SKIP)
:是一个回溯控制动词,可防止正则表达式引擎在匹配失败后回溯,这就是正常情况。(?!)
:与(*FAIL)