试图弄清楚如何使用正则表达式功能从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
...
我该怎么做才能在美国线路之后保存线路?
答案 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