【问题标题】:How to delete last 3 words from every line in Vim?如何从 Vim 中的每一行删除最后 3 个单词?
【发布时间】: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 word


    【解决方案1】:

    您最安全的选择是:

    :%norm $3gElD
    

    解释:

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

    gE 的原因是告诉 VIM 按照它定义为 WORD 的内容移动:一系列非空白字符,用空格分隔(包括破折号)。

    编辑:如果一行中有尾随空格,则上述操作将失败。您可以先使用 :%s/\s*$//g 删除文件中的所有尾随空格

    【讨论】:

    • 在给定示例的第一行有一个尾随空格,导致该命令无法在该行正常工作。
    • 确实如此。这是一件很容易摆脱的事情。 :-)
    • 确实,但如果没有:set list,则不会立即明显。
    【解决方案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
    

    【讨论】:

    • 如果单词由制表符或多个空格分隔,$3F D 将不起作用。 $3bDx 稍微好一点,但$3gelD 可能是最好的。 $3b3daw 的作用相同,但更长; $daw.. 是一个有趣的选择。当然是 :%norm 前缀。
    • @balintpekker: $3gelD 可能是最好的,但没有考虑用作减号的破折号。你会想要gE
    • @balintpekker,我的回答解决了问题中的示例,不多不少。 Michael 的解决方案更通用,但由于给定示例中第一行的尾随空格而失败。 Vim 根本不是要寻找绝对的通用解决方案。
    【解决方案3】:

    添加一个调用awk的答案:

    %!awk 'NF-=3'
    

    【讨论】:

      【解决方案4】:

      您可以使用视觉块,但如果单词的长度差异太大,这将不起作用。但是,它适用于您发布的示例。移动到 6 之后的空格,然后按 Ctrl+v。然后按 $ 跳到行尾并向下移动要删除的行数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 2015-03-03
        • 2011-10-14
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        相关资源
        最近更新 更多