regex - 大规模正则表达式搜索和替换模式之间
问题描述
我有一个包含一堆文本文件的目录,所有这些文件都遵循以下结构:
...
- Some random number of list items of random text
- And even more of it
PATTERN_A (surrounded by empty lines)
- Again, some list items of random text
- Which does look similar as the first batch
PATTERN_B (surrounded by empty lines)
- And even more some random text
....
而且我需要只对那些介于 PATTERN_A 和 PATTERN_B 之间的“列表项”运行替换操作(比如说,我需要在行首添加 CCC,就在破折号之后)。问题是它们与 PATTERN_A 上方或 PATTERN_B 下方的文本并没有太大区别,因此普通的正则表达式无法真正捕捉到它们而不影响其余文本。
所以,我的问题是,我应该使用什么工具和什么正则表达式来执行替换?
(以防万一,我对 Vim 很好,:cdo
例如,我可以在 QuickFix 中收集这些文件以供进一步使用。不幸的是,我对 awk 不太好,对 Perl 绝对不好 :))
谢谢!
解决方案
sed
如果我理解了您的问题,您可以使用模式范围选择和使用(流编辑器)的一般替换形式很容易地做到这一点。例如,在您的情况下:
$ sed '/PATTERN_A/,/PATTERN_B/s/^\([ ]*-\)/\1CCC/' file
- Some random number of list items of random text
- And even more of it
PATTERN_A (surrounded by empty lines)
-CCC Again, some list items of random text
-CCC Which does look similar as the first batch
PATTERN_B (surrounded by empty lines)
- And even more some random text
(注意:要在文件中添加-i
选项替换,并创建原始添加的备份,-i.bak
将原始文件另存为file.bak
)
解释
/PATTERN_A/,/PATTERN_B/
- 选择和之间PATTERN_A
的线PATTERN_B
s/^\([ ]*-\)/\1CCC/
- 替换(一般形式's/find/replace/'
),其中find
从包含(任意数量的空格和连字符)^
之间的行首捕获文本,然后是(称为反向引用,包含您使用捕获组捕获的所有字符)并附加到其末尾。\(...\)
[ ]*-
replace
\1
\(...\)
CCC
如果您有任何问题或我误解了您的问题,请仔细查看并告诉我。
推荐阅读
- python - 使用 pandas 计算大于先前值的值
- angular - Angular 7 新的路由代码.. 旧的 Angular 路由代码不起作用
- c# - 在集合中添加另一个对象时,如何覆盖 ObservableCollection 中的对象
- chef-infra - 厨师警告“没有找到配置文件:/solo.rb。改用命令行选项。”
- pandas - 熊猫将移动平均日基数转换为周基数
- sql - 在没有 DUAL 表的情况下使用 SYSDATE()
- numpy - 如何按列缩放特征?
- python - 如何解决此错误:预期 flatten_input 具有 3 个维度,但得到的数组形状为 (1, 28, 28, 3)?
- json - BSON 或 JSON crate 是否可以在找到一个无符号数时自动将字符串中的无符号数转换为浮点数?
- ios - 是否可以以编程方式创建展开序列?