在vim中,如何删除文件中除最后100行之外的所有行?

在vim中,如何删除文件中除最后100行之外的所有行?,vim,Vim,在vim中,当光标位于第一行时,我可以按下: 100日 删除前100行 但是如何删除除最后100行之外的所有行?在正常模式下: G100kdgg 换言之: G -> go to last line 100k -> go up 100 lines dgg -> delete to top of file 在ex模式下: :1,$-100d 说明:“:”将编辑器置于“ex模式”。ex mode的d命令删除指定为一个行号或一系列行的行。$是最后一行,算术可应用于行

在vim中,当光标位于第一行时,我可以按下:

100日

删除前100行

但是如何删除除最后100行之外的所有行?

在正常模式下:

G100kdgg
换言之:

G     -> go to last line
100k  -> go up 100 lines
dgg   -> delete to top of file
在ex模式下:

:1,$-100d

说明:“:”将编辑器置于“ex模式”。ex mode的d命令删除指定为一个行号或一系列行的行。$是最后一行,算术可应用于行号。

另一种通用解决方案:

:%!tail -100

您可以在
之后使用任何shell命令
可任意修改当前缓冲区。Vim启动命令并将当前文件提供给
stdin
,并从
stdout
读取新的缓冲区。我喜欢!如果缓冲区的行数少于100行,则此操作不起作用。它将不正确地删除所有行,因为
100k
部分无效。@DonCruickshank错误,如果少于100行,
100k
将转到第一行,
dgg
将删除该单行
k
被重复
100次,因此即使只有5行,它也会“撞击”缓冲区的顶部,然后停止。在执行所有操作之前,它不会预先检查。也就是说,是的,如果缓冲区中有100行或更少的行,它将错误地删除1行。但在我看来,这是一个比另一个被高估的答案更惯用的vim用法:它是一个由多个命令组成的“句子”,而不是一个更神秘的句子。@Izkata确实,你对vim的看法是正确的!由于某种原因,我的思维回到了Vi,在这种情况下,
100k
没有任何效果。@DonCruickshank啊,我不知道。。我只是偶尔被迫在vim不可用时使用vi,而且非常不喜欢它。这是一个更好的答案,伊姆霍