【问题标题】:How to find and replace multiple line texts in perl如何在perl中查找和替换多行文本
【发布时间】:2021-07-07 04:24:25
【问题描述】:

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

【问题讨论】:

  • 你需要perl -0777pe 's/a([^c]+)c/A$1c/g'perl -0pe 's/a([^c]+)c/A$1c/g'
  • (您不需要删除其他问题。即使是重复的问题也可以帮助人们,因为他们可能会在搜索中找到已关闭的问题,这将引导他们找到答案。)跨度>

标签: regex perl


【解决方案1】:

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

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

【讨论】:

  • 对于更灵活的解决方案,可以考虑使用\U$1\E$2 并捕获第一个匹配项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 2013-11-28
相关资源
最近更新 更多