如何从Vim的每一行删除最后3个单词?

时间:2014-07-31 04:45:11

标签: vim word

如何使用单个命令或使用录音从Vim中的每一行删除最后3个单词?

例如,之前,

10 3 -5 6 1 0 5 
5 9 -1 0 56 8 9
-6 0 45 8 6 3 0

后,

10 3 -5 6  
5 9 -1 0 
-6 0 45 8 

4 个答案:

答案 0 :(得分:6)

你最安全的赌注是:

:%norm $3gElD

说明:

对于文件中的所有行(%),在正常模式下(norm),移动到行尾($),然后向后移动3个WORD({{ 1}}),右边一个字符(3gE),删除光标下的字符,直到行尾。

l的原因是告诉VIM按照它定义为WORD的方式移动:一系列非空白字符,用空格分隔(包括短划线)。

编辑:如果一行中有尾随空格,则上述操作将失败。您可以先使用gE

删除文件中的所有尾随空格

答案 1 :(得分:2)

您可以使用此命令:

:%norm $3F D

修改

@balintpekker是对的,这个命令只假设单词之间有一个单独的空格。

@ MichaelFoukarakis的解决方案更通用,因为它支持可变数量的空格和制表符,但它在给定示例的第一行失败,因为它有一个尾随空格,强制您发出第二个(简单)命令。

替换肯定会更精确同时通用,但也更冗长:

:%s/\s\+\S\+\s\+\S\+\s\+\S\+\s*$

或:

:%s/\v\s+\S+\s+\S+\s+\S+\s*$

或者我们可以简单地做到UNIX风格:

:%!cut -d' ' -f -4

另一个编辑

在寻找更智能的cut使用方法时,我偶然发现了this answer,其中提到cut的多收费用版本cuts。它可以像这样使用:

:%!cuts -D' ' -0-3

答案 2 :(得分:2)

添加一个调用awk的答案:

%!awk 'NF-=3'

答案 3 :(得分:0)

您可以使用视觉阻止,但如果词的长度差异太大,这将无效。然而,它适用于您发布的示例。 6之后移动到空格,然后按Ctrl + v。然后按$跳到行尾并向下移动任意多行以删除。

不是最好的解决方案,但学会定期做这样的事情会大大提高你的工作效率。