Vim 删除除第一个实例外的所有行

Vim 删除除第一个实例外的所有行,vim,windows-7,Vim,Windows 7,如何删除已知行的第一个实例以外的所有实例 例如,我有 LOADING CONDITION : LIGHTSHIP CONDITION 其中有几个通过文件的内容传播开来。我只想保留第一个实例,它位于顶部附近 有人想知道吗?您可以将:global命令与范围结合使用 gg (make cursor back to top) /LOADING CONDITION : LIGHTSHIP CONDITION (enter) n :.,$g//d :0/LOADING CONDITION/

如何删除已知行的第一个实例以外的所有实例

例如,我有

LOADING CONDITION :   LIGHTSHIP CONDITION
其中有几个通过文件的内容传播开来。我只想保留第一个实例,它位于顶部附近


有人想知道吗?

您可以将
:global
命令与范围结合使用

gg (make cursor back to top)
/LOADING CONDITION :   LIGHTSHIP CONDITION (enter)
n
:.,$g//d   
:0/LOADING CONDITION/+,$g//d
说明:

  • [range]g/{pat}/{cmd}
    在给定行范围内与
    {pat}
    匹配的每一行上运行命令
    {cmd}
  • 0/加载条件/
    从第一行开始查找模式
    加载条件
  • 0/加载条件/+1
    在第一个实例下方开始范围1行
  • +1
    可以短接为
    +
    ,因为可以假定为1
  • ,$
    范围的末尾将是文件中的最后一行,该行被引用为
    $
  • g/
    使用最后一个搜索模式。在本例中,该范围内的图案
  • :delete
    或简称
    :d
    是用于删除行的ex命令
有关更多信息,请参阅

:h :g
:h :d
:h range
My提供了一个命令(以及其他相关命令),使此操作非常简单:

:DeleteDuplicateLinesOf /^LOADING CONDITION :   LIGHTSHIP CONDITION$/

我知道,我如何“按程序”做到这一点?所以我可以把它放在一个脚本文件中。我需要对272个文件执行此操作。它可以写在vim函数中。顺便问一下,那里有awk/sed吗?这很容易做到。@ldigas刚刚看到你对awk/grep的评论,sry。你还没有问过同样的问题吗?!可能与@IngoKarkat重复-是的,相似。在另一种情况下,我感兴趣的是删除所有重复多次的行的第一个实例。我事先不知道它的内容。我只想一份一份。在这种情况下,我想删除内容已知的行的第一个副本以外的所有副本。另外,我想在没有awk/grep/的情况下完成它。。。因为这些工具在Windows上通常不可用。@IngoKarkat ha,当我看到这个问题时,我觉得我以前回答过它,但不确定。。。您发现了这个链接……非常好的解释,并且巧妙地使用了
/{pattern}/
作为范围的一部分。