我有一个名为“data”的文本文件,内容为:
a
b
c
abc
我想找到所有的“abc”(不需要在同一行)并将前导的“a”替换为“A”。这里的“b”可以是任何字符(一个或多个),但不能是“c”。
(这是我实际用例的简化。)
我认为这个 perl 命令可以
perl -pi.bak -e 's/a([^c]+?)c/A\1c/mg' data
此“数据”更改为:
a
b
c
Abc
我期待:
A
b
c
Abc
我不知道为什么 perl 错过了第一次出现(在第 1-3 行)。
如果您发现我的 perl 命令有任何问题,或者您知道一个可行的替代方案,请告诉我。非常感谢。
答案 0 :(得分:3)
您一次阅读一行,将代码应用到该行。它不可能跨多行匹配。简单的解决方案是告诉 perl
使用 -0777
将整个文件视为一行。
perl -i.bak -0777pe's/a([^c]+c)/A$1/g' data
\1
替换为 $1
。/m
。它只影响 ^
和 $
,但您不使用它们。c
移到捕获中以避免重复。