为什么这个 vim 搜索和替换功能需要多次“运行”才能完全工作

noa*_*oah 1 regex vim

我正在使用以下 vim 命令: :v/^\w*sub/s/.*\n//g

我希望它去掉任何不以开头的行,sub这样我就可以快速浏览我的 perl 脚本中的所有子标题。

它最终可以工作,但我必须“运行”该命令 8 次才能让它只留下正确的行。为什么它不只是第一次工作?不确定它是否重要,但文件是 ~1600 行,它从第一次删除 ~700 行开始,但最后一次只删除最后 2 行。

rom*_*inl 5

:help :g:help :v分两次工作:

  1. 他们在每个匹配的行上打上内部标记,
  2. 他们对每个标记的行执行给定的操作。

这里的问题是,您告诉 Vim 在标记行上执行的操作与由:v. 由于某些标记丢失,:v无法对它们执行给定的操作。

为了进行比较,请看以下结果:

:v/^\w*sub/s/.*//g
Run Code Online (Sandbox Code Playgroud)

它不会替换换行符,因此不会弄乱:v的内部标记,从而按预期在每一行上执行替换。

:help :s无论如何都是错误的工作工具。正如有人已经评论过的那样,适合这项工作的工具是:help :d

:v/^\w*sub/d
Run Code Online (Sandbox Code Playgroud)