如何删除Vim中每行的最后3个单词?
如何使用单个命令或录音从Vim中的每一行中删除最后3个字 比如说以前,如何删除Vim中每行的最后3个单词?,vim,word,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 您可以使用以下命令: :%norm $3F D 编辑 @balintpekker说得对,这个命令只假设单词之间只有一个空格 @MichaelFoukarakis的解决方案更通用,因为它支持可变数量的空格和制表符,但在给定示例的第一行失败,因为它有一个
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
您可以使用以下命令:
:%norm $3F D
编辑
@balintpekker说得对,这个命令只假设单词之间只有一个空格
@MichaelFoukarakis的解决方案更通用,因为它支持可变数量的空格和制表符,但在给定示例的第一行失败,因为它有一个尾随空格,迫使您发出第二个(简单)命令
同时,替换肯定会更加精确和通用,但也会更加冗长:
:%s/\s\+\S\+\s\+\S\+\s\+\S\+\s*$
或:
或者,我们也可以简单地以UNIX方式进行:
:%!cut -d' ' -f -4
另一次编辑
在寻找一种更智能的使用cut
的方法时,我无意中发现了一种称为cuts
的收费过高的cut
。它可以这样使用:
:%!cuts -D' ' -0-3
您最安全的赌注是:
:%norm $3gElD
说明:
对于文件中的所有行(%
),在正常模式下(norm
),移动到行的末尾($
),然后向后移动3个字(3gE
),向右移动一个字符(l
),并删除光标下的字符,直到行的末尾
之所以使用gE
,是为了告诉VIM按照其定义的单词移动:一系列非空白字符,用空格分隔(包括破折号)
编辑:如果一行中有尾随空格,上述操作将失败。您可以首先使用
:%s/\s*$//g
删除文件中的所有尾随空格,然后添加一个调用awk的答案:
%!awk 'NF-=3'
您可以使用可视块,但如果单词的长度差异太大,则无法使用可视块。不过,它将适用于您发布的示例。移动到6之后的空格,然后按Ctrl+v。然后按$跳转到行尾,并向下移动要删除的行数
这不是最好的解决办法,但学会定期做这样的事情会大大提高你的工作效率 如果单词之间用制表符或多个空格分隔,
$3F D
将不起作用<代码>$3bDx稍好一些,但$3gelD
可能是最好的<代码>$3b3daw的作用相同,但更长<代码>$daw..是一个有趣的选择。当然有:%norm
前缀。@balintpekker:$3gelD
可能是最好的,但不考虑用作减号的破折号。你需要gE
@balintpekker,我的答案是针对问题中的样本,不多不少。Michael的解决方案更通用,但由于给定示例中第一行的尾随空格而失败。Vim根本不是寻找绝对的通用解决方案。给定示例的第一行中有一个尾随空格,它阻止该命令在该行上正确工作。确实如此。这是一件容易摆脱的事情。:-)确实如此,但如果没有:set list
,则不会立即显示。
%!awk 'NF-=3'