大规模正则表达式搜索和替换模式之间

时间:2018-11-20 15:50:34

标签: regex shell

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

...
 - 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没问题,例如,我可以将这些文件收集在QuickFix中以供另外:cdo使用。我对awk并不满意,不幸的是,绝对不好与Perl:))

谢谢!

2 个答案:

答案 0 :(得分:2)

如果我已经理解了您的问题,则可以很容易地进行模式范围选择,并使用<VictoryChart theme={VictoryTheme.material} domain={{x: [1, 5], y: [-7, -2]}} > <VictoryAxis orientation="top" /> <VictoryAxis dependentAxis orientation="left" invertAxis /> <VictoryLine style={{ data: { stroke: "#c43a31" }, parent: { border: "1px solid #ccc"} }} data={[ { x: 1, y: -2 }, { x: 2, y: -3 }, { x: 3, y: -5 }, { x: 4, y: -4 }, { x: 5, y: -7 } ]} /> </VictoryChart> (流编辑器)进行一般替换。例如,在您的情况下:

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(称为 backreference ,其中包含您在捕获组\1中捕获的所有字符),将\(...\)附加到末尾。

仔细研究一下,如果您有任何疑问或我误解了您的问题,请告诉我。

答案 1 :(得分:1)

同样使用Perl,您可以获得结果

> perl -pe ' { s/^(\s*-)/\1CCC/g if /PATTERN_A/../PATTERN_B/ } ' mass_replace.txt
...
 - 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
....
>