首页 > 解决方案 > 大规模正则表达式搜索和替换模式之间

问题描述

我有一个包含一堆文本文件的目录,所有这些文件都遵循以下结构:

...
 - 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 绝对不好 :))

谢谢!

标签: regexshell

解决方案


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

如果您有任何问题或我误解了您的问题,请仔细查看并告诉我。


推荐阅读