尝试找出如何使用正则表达式功能从 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
...
美国线之后我该怎么办才能保存线路?
如果我理解正确的话,: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
:%s/## United States\n^.*\n\zs\|.*\n//g