在 vim 中搜索由多字符序列分隔的记录

在 vim 中搜索由多字符序列分隔的记录

几个星期以来我一直在网上寻找答案,但仍然不知所措......

我有一个文件(正在 VIM 中编辑),包含多行记录 - 本质上是由“\n\n X”分隔的段落,其中 X 可能是不同的字符。

我需要在 vim 内部查找包含所有查找单词的所有记录(并突出显示查找的单词),可能这些单词本身就是搜索模式。

也可以这样说:我如何告诉 vim 查找多行搜索模式的结果,其中这些结果不包含序列“\n\n [aZ.,+*$#@!]”(因为这样的序列将所寻找的记录分隔开并且一直出现在其中)。

谢谢!

编辑#1:为了更好地解释,我添加了 5 个记录样本,每个记录之间是:\n\n\s_\s\d+(其中 \s 是 0x20 而 _ 是几个可能的 ascii 字符之一):

 * 110000000018BBRT Phasellus aliquet blandit tellus,
sed sollicitudin augue accumsan vel.

 + 978000220019KML  Mauris et hendrerit dolor, a dapibus ante.
  * Vestibulum viverra ultricies urna.

 ! 020007005289KML  Vestibulum a malesuada enim.
Cras a efficitur est.
Suspendisse in nulla a justo finibus tincidunt.

 x 949317999999BTVN Sed facilisis massa eget mattis feugiat.
  o Interdum et malesuada fames ac ante ipsum primis in faucibus.

 v 949317999999BTV  Vestibulum at lectus at neque malesuada venenatis.
 Aliquam.

答案1

我不知道这是否对您有帮助,但这里有一个模式,它匹配red和的任意组合blue(无论顺序如何),仅当两者都出现在由两个空行分隔的块中(\n\n\n;第一个换行符来自最后一个块的末尾,然后两个换行符为新行;您需要使其适应您的精确分隔符)。

这建立在基本模式的基础上,以任意顺序匹配一行中的red和:blue

/\%(red.*blue\)\|\%(blue.*red\)/

然后将每个分支的简单块扩展为它们之间.*没有的(多行)块。\n\n\n

一个分支用于red...blue块,另一个分支用于blue...red块:

/\%(red\_.\{-}\%(\n\n\n\|blue\)\)\@>\%(blue\)\@<=/
/\%(blue\_.\{-}\%(\n\n\n\|red\)\)\@>\%(red\)\@<=/

最终结果只是将两者结合起来,并切换到旧的正则表达式引擎由于 Vim 中的一个错误

/\%#=1\%(\%(red\_.\{-}\%(\n\n\n\|blue\)\)\@>\%(blue\)\@<=\)\|\%(blue\_.\{-}\%(\n\n\n\|red\)\)\@>\%(red\)\@<=/

如果这听起来难以理解或太复杂,可能需要另一种方法(例如首先将所有块连接成单行,使其更容易匹配)。由于您提供的背景信息很少,也没有示例内容,我无法对此进一步发表评论。

相关内容