如何使用单个命令或使用录音从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
答案 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。然后按$跳到行尾并向下移动任意多行以删除。
不是最好的解决方案,但学会定期做这样的事情会大大提高你的工作效率。