我想对两个定界模式(包括定界符,包括多次出现的定界符)之间的所有文本进行操作。
例如::g/pattern1/,/pattern2/s/\n/^A
将在^A
和pattern1
之间(包括其在内)的所有行上用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
答案 0 :(得分:1)
如果您可以确定在一个组中没有重复pattern1
,则从pattern2
到pattern1
的向后搜索要容易得多
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