首页 > 解决方案 > 如何在perl中查找和替换多行文本

问题描述

我有一个名为“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 命令有任何问题,或者您知道可行的替代方法,请告诉我。非常感激。

标签: regexperl

解决方案


你一次读一行,将代码应用到那一行。它不可能跨多行匹配。简单的解决方案是告诉perl将整个文件视为一行,使用-0777.

perl -i.bak -0777pe's/a([^c]+c)/A$1/g' data
  • 将不正确的替换\1$1.
  • 去掉了没用的/m。它只影响^and $,但你不使用它们。
  • 移除了无用的非贪婪修饰符。
  • 将 移动c到捕获中以避免重复。

推荐阅读