根据两次比赛之间(包括两次比赛)的模式进行操作

时间:2018-07-26 15:32:05

标签: vim

我想对两个定界模式(包括定界符,包括多次出现的定界符)之间的所有文本进行操作。

例如::g/pattern1/,/pattern2/s/\n/^A将在^Apattern1之间(包括其在内)的所有行上用pattern2替换换行符。但是,如果pattern2出现3次以上,它将仅匹配到pattern1之后的第二个匹配项,我不确定为什么。我想将其扩展为匹配所有出现的pattern2,但不包括下次出现的pattern1。

示例数据:

pattern1
text
more text
pattern2

pattern1
text
pattern2
pattern2

pattern1
text
pattern2
pattern2
pattern2

所需的最终状态:

pattern1^Atext^Amore text^Apattern2^A
pattern1^Atext^Apattern2^Apattern2^A
pattern1^Atext^Apattern2^Apattern2^Apattern2^A

实际结束状态:

pattern1^Atext^Amore text^Apattern2^A
pattern1^Atext^Apattern2^Apattern2

pattern1^Atext^Apattern2^Apattern2
pattern2

2 个答案:

答案 0 :(得分:1)

如果您可以确定在一个组中没有重复pattern1,则从pattern2pattern1的向后搜索要容易得多

g/pattern2/?pattern1?,.s/\n/^A

关于您只匹配pattern1之后的第二个匹配项的问题,实际上并不是这样。

对于每次pattern1

  • 第一个pattern2已匹配
  • 该组中每个项目的eol更改为^A

从第二个eol开始,从未更改过pattern2。 从这个

pattern2
pattern2

只有第一个pattern2被更改,但这会导致

pattern2^Apattern2

答案 1 :(得分:1)

一种方法可能是删除重复的'pattern2'字符串,然后应用(pattern1,pattern2)范围受限制的替换:

:%s/\(pattern2\)\(\n\1\)\+/\1/ | g/pattern1/,/pattern2/s/\n/^A