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

问题描述 投票:0回答:2

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

我尝试过的:

我对此正则表达式模式进行斜杠前向搜索:

\d\+_.*\n.*

匹配两对线:

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

然后我尝试使用以下方法删除除这些匹配之外的所有内容:

:v//d 

我明白了:

3_Tumour_ID
4_Day_DoB

但我期待这个:

3_Tumour_ID
Tumour identification
4_Day_DoB
Day of birth

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

我想要匹配的第二行(在我想要匹配的每对行中)仅在它立即接续每对中的第一行的前提下进行匹配。

vim edit
2个回答
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

注意:我使用

2Y
是因为你的模式中有一个
\n
,也就是说,你的匹配结果将始终是两行。


0
投票

您可以使用以下正则表达式之一:

:%g!/Tumour\|Day/d

负全局命令

g!

:%s/\(^.*Tumour.*\n\|^.*Day.*\n\)\zs\|.*\n//g

或者这个相当复杂的替换

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.