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

时间:2019-01-08 22:21:19

标签: regex vim

试图弄清楚如何使用正则表达式功能从vim中删除除模式以外的所有内容。

具体来说,我正在尝试删除除“美国”行以及紧随其后的行(从Arch Linux镜像列表中)以外的所有内容。 所以这个...

## 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选择除模式之外的所有内容。我尝试提供的模式是美国行加上下一行(\ n),然后是行尾的所有内容(\ _。\ {-} \ _ $),然后删除所有这些垃圾(/ d)。

但是,执行该行时,我仅获得与美国的行。像这样:

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

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

1 个答案:

答案 0 :(得分:3)

  

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

关闭。但不完全是。有一个细微的区别。 :v(或:g!)将在与正则表达式不匹配的每一行上运行特定的命令 。确实真的很接近您想要的东西,只是还远远不够。这是问题所在。该行:

## United States

确实与您的正则表达式匹配,这是事实。因此,此行不会被删除。但是,此后的代码行将被测试,并且

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

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

我想到的最简单的解决方案是匹配每条位置线(因此,您的行以## <location>开头,而不是## United States ,然后分别匹配匹配,则删除该行以及以下内容。例如:

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