Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除Vim中每行的最后3个单词?_Vim_Word - Fatal编程技术网

如何删除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的解决方案更通用,因为它支持可变数量的空格和制表符,但在给定示例的第一行失败,因为它有一个

如何使用单个命令或录音从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的解决方案更通用,因为它支持可变数量的空格和制表符,但在给定示例的第一行失败,因为它有一个尾随空格,迫使您发出第二个(简单)命令

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

:%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'