Vim:向后范围——可以交换

Vim: Backwards range -- OK to swap

我有一个文件,其中包含来自不同查询的大量 SQL 输出——包括来自每个查询的 headers。

例如

userid  firstname       surname cardnumber
billy   william         smith   472750  
userid  firstname       surname cardnumber
steve   bubba           gump    472751
userid  firstname       surname cardnumber
george  Gigi            Jones   989989

抛开我可以关闭 header 的事实 ...

假设我想保留 header 的第一个实例并删除所有其他实例:

在vim中:

:2,$/^userid/d

所以 -- 从第 2 行开始,到最后一行结束 -- 删除所有以 userid 开头的行。似乎合乎逻辑——我可以使用 :g [并且它有效],但如果我尝试范围:

,我会收到此消息

Backwards range given, OK to swap (y/n)?

我错过了什么?

:g 需要一个范围所以我认为要使用的正确命令是 :2,$g/^userid/d.

不完全确定没有 g 会发生什么,但当我测试它时它似乎并没有按照你想要的方式进行。

这是文档对任何情况下的错误的描述 (:h 493)

Reverse Range                       *E493*

A range should have the lower line number first.  If this is not the case, Vim
will ask you if it should swap the line numbers.
    Backwards range given, OK to swap ~
This is not done within the global command ":g".

You can use ":silent" before a command to avoid the question, the range will
always be swapped then.