vim-匹配满足不同条件之间的多行内容
vim-匹配满足不同条件之间的多行内容
有的时候想删除两个字符串之间的所有内容,但是涉及多行,虽然 sed 和 awk 也可以实现,但是既然使用 vim/nvim 了,也可以直接使用 vim/nvim 实现。
在 Vim 中要匹配两段文本之间的所有内容,包括跨越多行的内容,可以使用正则表达式配合 \_.*
的特殊语法。\_.*
可以匹配任意字符(包括换行符)直到结束条件。
1. 基本匹配方式
假设你想匹配从 aaa
到 bbb
之间的所有内容,包括中间的换行符,你可以使用以下正则表达式:
1
/aaa\_.\{-}bbb
aaa
:匹配开始的文本。\_.
:匹配任意字符,包括换行符。\{-}
:非贪婪匹配(尽可能少地匹配内容)。bbb
:匹配结束的文本。
2. 示例:
如果有以下文本:
1
2
3
4
5
6
tttttttttttttttt
aaa
some text
more text
bbbdd
test
执行搜索命令 /aaa\_.\{-}bbb
会匹配从 aaa
到 bbb
之间的所有内容。
3. 替换匹配内容
如果想将 aaa
和 bbb
之间的内容替换成其他内容,可以使用如下命令:
1
:%s/aaa\_.\{-}bbb/aaaNEW_CONTENTbbb/
这会将 aaa
和 bbb
之间的内容替换为 NEW_CONTENT
,保留 aaa
和 bbb
。
4. 删除匹配的多行内容
1
2
:g/aaa/,/bbb/d
- :g/aaa/:从匹配到 aaa 的行开始。
- ,/bbb/:一直匹配到 bbb 的行。
- d:删除这些行。 这样会删除从 aaa 到 bbb 之间的所有行,包括 aaa 和 bbb 自身。
如果需要保留匹配的行,而将匹配行之间的内容删除,可以使用以下方式:
%s/aaal_.{-}bbb/aaa\rbbb/g
利用换行符达到删除的效果,Linux 下为 “\r” , Windows 下为 “\r\n”
本文由作者按照
CC BY 4.0
进行授权