几个星期以来我一直在网上寻找答案,但仍然不知所措......
我有一个文件(正在 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\)\@<=/
如果这听起来难以理解或太复杂,可能需要另一种方法(例如首先将所有块连接成单行,使其更容易匹配)。由于您提供的背景信息很少,也没有示例内容,我无法对此进一步发表评论。