regex - 如何在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 命令有任何问题,或者您知道可行的替代方法,请告诉我。非常感激。
解决方案
你一次读一行,将代码应用到那一行。它不可能跨多行匹配。简单的解决方案是告诉perl
将整个文件视为一行,使用-0777
.
perl -i.bak -0777pe's/a([^c]+c)/A$1/g' data
- 将不正确的替换
\1
为$1
. - 去掉了没用的
/m
。它只影响^
and$
,但你不使用它们。 - 移除了无用的非贪婪修饰符。
- 将 移动
c
到捕获中以避免重复。
推荐阅读
- python - Python语句和函数的区别
- java - 重命名文件时出错
- c# - 有没有办法在开发环境中查看数组元素及其索引值?
- python - 尝试在 Python 中执行 AutoIT 脚本的错误消息
- javascript - React Service Worker fetch 事件监听器永远不会为外部 API 请求执行
- grafana - Grafana Prometheus 饼图时间范围
- animation - 我正在寻找更好的 Google 幻灯片动画设置 - API 或其他
- angular - 在 ngOnIt 中调用后订阅的数组不会更新。角
- html - 实现选项卡指示器总是溢出
- mysql - MySQL --- SELECT 查询满足多个元组的条件