vim-删除所有以datetime开头且不包含类名的行

vim-删除所有以datetime开头且不包含类名的行,vim,sed,Vim,Sed,我想知道如何删除所有以字符串开头的行,除非它们包含字符串“ApplicationMaster”。我希望不要删除不以12/25/2015开头的行 在sed中,我可以这样做cat file.txt | sed'/^12\/25\/2015/{/ApplicationMaster/!d},但在vim中,我无法找到一种通用的方式来表示“对于与给定正则表达式匹配的所有行,在其上应用此sub/delete模式” 在vim中是否有类似的方法来执行此操作?您只需通过稍微修改的sed命令来运行缓冲区: :%!se

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

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


在vim中是否有类似的方法来执行此操作?

您只需通过稍微修改的
sed
命令来运行缓冲区:

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

使用Vim执行此操作的一种方法:

:v /ApplicationMaster/ s!\m^12/25/2015.*\n!!
另一种方法是采用消极前瞻:

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

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

:LogiPat "^12/12/2015"&!"ApplicationMaster"
:g//d
注意:
:LogiPat
用于此模式的正则表达式最终为:
\%(.*^12/12/2015.*\&^\%(\%(ApplicationMaster\)\@!\)*$\)

有关更多帮助,请参阅:

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

\m
的作用是什么?@anthonybell它使regexp独立于
magic
选项。有关详细信息,请参见
:h/\m
:h/magic