Vim手册说
:[range]v[global]/{pattern}/[cmd] Execute the Ex command [cmd] (default ":p") on thelines within [range] where {pattern} does NOT match."
但是当使用“:v / {pattern1} /,/ {pattern2} / [cmd]”之类的命令时,结果不是我想要的,我也不明白为什么。
对于exapler,有一个文本文件
1
2
3
4
5
当我执行命令“:g / 2 /,/ 4 / d”时,从“ 2”到“ 4”的行将被删除。没关系。
但是,如果我执行命令“:v / 2 /,/ 4 / d”,它就不会像我所知道的那样起作用。
我认为应该将三行从“ 2”保留为“ 4”,删除其他行,但不要删除。
或者,我认为命令“:v / 2 /,/ 4 / d”可能类似于“:g / [^ 2] /,/ [^ 4] / d”,但事实并非如此。
那么,命令“:v / {pattern1} /,// {pattern2} / [cmd]”的确切含义是什么?
该命令将执行应做的事情。我认为您无法正确理解该命令。我尝试解释一下。
首先,:g
一个。您有::g/p1/,/p2/d
我们应该将命令读取为:
:g/p1/ "for each line match p1
,/p2/d "till line match p2, delete.
在这里,您使用了一个范围,从行匹配p1
到(,
逗号)行匹配p2
。在您的1-5
示例中,vim找到第一个匹配的行#2
,然后有一个2,/4/d
,因此删除了第2-4行。:g
还没有完成,它看起来是剩下的行:这5
行,它不匹配/2/
,下一行,哎呀,打了EOF,所以:g
就完成了它的工作。
如果从中创建示例1 to 20
,则会看到一些错误msg Pattern not found
,这是因为:g
可以找到/2/
,但再也找不到范围结尾了/4/
,该位置已由上一条d
命令删除。自己做一个测试,您会明白我的意思的。
如果:g
很清楚,:v
就很容易理解。:v/2/,/4/d
vim搜索第一行不匹配/2/
,它将是第一行1
,然后执行do 1,/4/d
,即删除了第1-4行。:v
命令尚未完成,它转到的行5
,现在是行号1,也不匹配/2/
,因此vim接受它,执行a 1,/4/d
,但是/4/
缓冲区中没有行匹配,因此pattern not found
错误消息将是显示。并:v
命令完成了它的任务。
您应该记住,:g/{pattern}/cmd
不是:g{range}cmd
。模式和范围是不同的东西。做一个:h range
看细节
这就是为什么您得到结果。希望是清楚的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句