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