2016-09-11 47 views
2

我在想如何刪除所有以字符串12/25/2015開頭的行,除非它們包含字符串'ApplicationMaster'。我想要不以12/25/2015開頭的行不被刪除。vim - 刪除所有不包含類名的日期時間開始的行

在sed我可以做到這一點cat file.txt | sed '/^12\/25\/2015/ { /ApplicationMaster/!d },但在vim中,我無法弄清楚「對於給定的正則表達式匹配的所有行,在其上應用這個子/刪除模式」。

在vim中有這樣做的等效方法嗎?

回答

4

一種方法用Vim做到這一點:

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

的另一種方式,與負前瞻:

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

\ m是什麼? – anthonybell

+0

@anthonybell它使得正則表達式獨立於'magic'選項。有關詳細信息,請參閱':h/\ m'和':h/magic'。 –

1

你可以簡單地通過你的sed命令的稍微改變版本上運行您的緩衝區:

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

這是一個很酷的技巧有。謝謝! – anthonybell

0

Vim附帶:LogiPat這將允許boole一種模式的邏輯。使用:LogiPat將設置搜索寄存器@/。一旦搜索模式設置,您可以輕鬆使用:g:d刪除違規行。

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

注::LogiPat的正則表達式這種模式最終被:\%(.*^12/12/2015.*\&^\%(\%(ApplicationMaster\)\@!.\)*$\)

如需更多幫助,請參見:

:h logipat-man 
:h :g 
:h :d 
:h "/ 
相關問題