删除除模式和下一行 vim 之外的所有内容

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

尝试找出如何使用正则表达式功能从 vim 中删除除模式之外的所有内容。

具体来说,我正在尝试删除除“United States”行以及紧随其后的行(来自 Arch Linux Mirrorlist)之外的所有内容。 所以这个...

## Austria
Server = http://mirror.easyname.at/archlinux/$repo/os/$arch
## United States
Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch
## Thailand
Server = http://mirror2.totbb.net/archlinux/$repo/os/$arch

应该转变为这个...(并对美国线的每个实例继续这个)

## United States
Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch

我尝试用来完成此操作的行是:

:v/## United States\n\_.\{-}\_$/d

如果我理解正确的话,:v 选择除模式之外的所有内容。我试图输入的模式是美国行加上下一行( )以及之后的所有内容到行尾(\_.\{-}\_$),然后删除所有这些垃圾(/d)。

但是,在执行该行时,我只得到与美国相关的行。像这样的东西:

## United States
## United States
## United States
...

美国线之后我该怎么办才能保存线路?

regex vim
2个回答
3
投票

如果我理解正确的话,:v 选择除模式之外的所有内容。我试图输入的模式是美国行加上下一行( )以及之后的所有内容到行尾(\_.\{-}\_$),然后删除所有这些垃圾(/d)。

关闭。但也不完全是。有一个微妙的区别。

:v
(或
:g!
)将在与正则表达式不匹配的每一行上运行特定命令。这真的非常接近你想要的,只是不完全在那里。问题就在这里。线路:

## United States

does 与您的正则表达式匹配,这是真的。因此,这一行不会被删除。然而,紧随其后的线路会被测试,并且

Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch

与您的正则表达式不匹配。所以它确实被删除了。

我能想到的最简单的解决方案是匹配每个位置行(因此您的行以

## <location

>开头)
other而不是## United States
,然后对于每个匹配,删除该行和以下行。例如:

:g/## \(United States\)\@!/,+1d
    

0
投票
也可以使用这个正则表达式:

:%s/## United States\n^.*\n\zs\|.*\n//g
    
© www.soinside.com 2019 - 2024. All rights reserved.