【发布时间】:2014-07-31 04:45:11
【问题描述】:
如何使用单个命令或使用录音删除 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
【问题讨论】:
如何使用单个命令或使用录音删除 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 $3gElD
解释:
对于文件中的所有行 (%),在正常模式下 (norm),移动到行尾 ($),然后向后移动 3 个 WORD (3gE),一个字符到右边(l),删除光标下的字符直到行尾。
gE 的原因是告诉 VIM 按照它定义为 WORD 的内容移动:一系列非空白字符,用空格分隔(包括破折号)。
编辑:如果一行中有尾随空格,则上述操作将失败。您可以先使用 :%s/\s*$//g 删除文件中的所有尾随空格
【讨论】:
:set list,则不会立即明显。
你可以使用这个命令:
:%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
【讨论】:
$3F D 将不起作用。 $3bDx 稍微好一点,但$3gelD 可能是最好的。 $3b3daw 的作用相同,但更长; $daw.. 是一个有趣的选择。当然是 :%norm 前缀。
$3gelD 可能是最好的,但没有考虑用作减号的破折号。你会想要gE。
添加一个调用awk的答案:
%!awk 'NF-=3'
【讨论】:
您可以使用视觉块,但如果单词的长度差异太大,这将不起作用。但是,它适用于您发布的示例。移动到 6 之后的空格,然后按 Ctrl+v。然后按 $ 跳到行尾并向下移动要删除的行数。
不是最好的解决方案,但定期学习做这样的事情会大大提高您的工作效率。
【讨论】: