删除除多行模式之外的所有内容,其中结尾定义为第一行之后的1行

Ras*_*sen 1 vim edit

我希望删除与模式不匹配的所有内容

我尝试过的:

我对这个正则表达式模式进行了斜线搜索:

\d\+_.*\n.*
Run Code Online (Sandbox Code Playgroud)

匹配两对线:

A
50
Y
Not allowed
According to registry coding
3_Tumour_ID                      ### match
Tumour identification            ### match
A
50
Y
Not allowed
According to registry coding
4_Day_DoB                        ### match
Day of birth                     ### match
F
2
Run Code Online (Sandbox Code Playgroud)

然后我尝试删除除了这些匹配之外的所有内容:

:v//d 
Run Code Online (Sandbox Code Playgroud)

我明白了:

3_Tumour_ID
4_Day_DoB
Run Code Online (Sandbox Code Playgroud)

但我期待这个:

3_Tumour_ID
Tumour identification
4_Day_DoB
Day of birth
Run Code Online (Sandbox Code Playgroud)

这是正确的,因为它保留所有匹配的行,而不仅仅是每个匹配的第一行.

我希望匹配的第二行(在我希望匹配的每对行中)仅在它立即成为每对中的第一行的前提下匹配.

Ken*_*ent 5

你不能用:v//del comd它来做.因为您的搜索模式包含新行,但是:g, :v会进行基于行的处理.因此Tumour...,Day of...行和将:v再次处理,最后删除.

你可以尝试的是:

qaq    (to clear "a register)
:g//norm! "A2Y   (this copy all matched lines into register a)
ggVG"ap
Run Code Online (Sandbox Code Playgroud)

注意:我使用的2Y是因为你\n的模式中有一个,也就是说,你的匹配结果总是两行.