文章

vim-匹配满足不同条件之间的多行内容

vim-匹配满足不同条件之间的多行内容

有的时候想删除两个字符串之间的所有内容,但是涉及多行,虽然 sed 和 awk 也可以实现,但是既然使用 vim/nvim 了,也可以直接使用 vim/nvim 实现。

在 Vim 中要匹配两段文本之间的所有内容,包括跨越多行的内容,可以使用正则表达式配合 \_.* 的特殊语法。\_.* 可以匹配任意字符(包括换行符)直到结束条件。

1. 基本匹配方式

假设你想匹配从 aaabbb 之间的所有内容,包括中间的换行符,你可以使用以下正则表达式:

1
/aaa\_.\{-}bbb
  • aaa:匹配开始的文本。
  • \_.:匹配任意字符,包括换行符。
  • \{-}:非贪婪匹配(尽可能少地匹配内容)。
  • bbb:匹配结束的文本。

2. 示例:

如果有以下文本:

1
2
3
4
5
6
tttttttttttttttt
aaa
some text
more text
bbbdd
test

执行搜索命令 /aaa\_.\{-}bbb 会匹配从 aaabbb 之间的所有内容。

3. 替换匹配内容

如果想将 aaabbb 之间的内容替换成其他内容,可以使用如下命令:

1
:%s/aaa\_.\{-}bbb/aaaNEW_CONTENTbbb/

这会将 aaabbb 之间的内容替换为 NEW_CONTENT,保留 aaabbb

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 进行授权