【问题标题】:vim - delete all lines starting with datetime that dont contain a classnamevim - 删除所有以 datetime 开头但不包含类名的行
【发布时间】:2017-01-18 21:16:47
【问题描述】:

我想知道如何删除以某个字符串 12/25/2015 开头的所有行,除非它们包含字符串“ApplicationMaster”。我希望不删除不以12/25/2015 开头的行。

在 sed 中,我可以做到这一点 cat file.txt | sed '/^12\/25\/2015/ { /ApplicationMaster/!d },但在 vim 中,我无法找到一种通用的说法:“对于与给定正则表达式匹配的所有行,在其上应用此子/删除模式”。

在 vim 中是否有等效的方法?

【问题讨论】:

    标签: vim sed


    【解决方案1】:

    使用 Vim 的一种方法:

    :v /ApplicationMaster/ s!\m^12/25/2015.*\n!!
    

    另一种方式,负前瞻:

    :g -\m^12/25/2015\(.*\<ApplicationMaster\>\)\@!- d
    

    【讨论】:

    • \m 是干什么用的?
    • @anthonybell 它使正则表达式独立于magic 选项。详情请参阅:h /\m:h /magic
    【解决方案2】:

    你可以简单地通过你的sed命令的一个稍微改变的版本来运行你的缓冲区:

    :%!sed '/^12\/25\/2015/ { /ApplicationMaster/\!d }'
    

    【讨论】:

      【解决方案3】:

      Vim 附带:LogiPat,它允许布尔逻辑与模式。使用:LogiPat 将设置搜索寄存器@/。设置搜索模式后,您可以轻松使用 :g:d 删除违规行。

      :LogiPat "^12/12/2015"&!"ApplicationMaster"
      :g//d
      

      注意::LogiPat 这个模式的正则表达式最终是:\%(.*^12/12/2015.*\&amp;^\%(\%(ApplicationMaster\)\@!.\)*$\)

      如需更多帮助,请参阅:

      :h logipat-man
      :h :g
      :h :d
      :h "/
      

      【讨论】:

        猜你喜欢
        • 2020-09-23
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多