2014-01-13 47 views
7

解析日誌文件時,我經常使用:g!/<string I want to keep in the log>/d從日誌中刪除不包含感興趣的字符串的所有行。那麼,現在我想用這個強大的命令來替換所有與空行不匹配的字符串。使用Vim將所有*非*匹配的字符串替換爲另一個字符串

我能找到一點上:g!沒有信息,比我已經使用命令等,並且該格式是:g!/<match string>/<cmd>,其中cmd是「ex命令」,或之一:在vim的命令。

所以我認爲可以使用s命令來做到這一點,但我的理解是有限的這方面。任何人都可以建議如何正確格式化命令?或者還有其他工具更適合這項任務嗎? (sed/awk?我沒有真正使用過這些,但知道它們非常強大)。

另一種選擇是在Python中踢出並寫一個實用程序來爲我做。

回答

12

首先,您可以使用:v作爲:g!的快捷方式。詞源來自標準grep命令的-v選項,我想。

是的,你可以使用任何ex命令,包括:s。默認情況下,:s作用於一行;將其與:g(或:g!:v)結合使用,您可以選擇其行爲所在的行。如果我理解正確,那麼

:v/<string I want to keep>/s/.*// 

正是你想要的。您可能需要跟進:noh

附錄:我對這個簡短答案的受歡迎程度有點驚訝。有趣的是,文檔(:help :g,然後向下滾動)提到:%s/pat/PAT/g作爲替代(「兩個字符更短!」)至:g/pat/s//PAT/g。我認爲這意味着:g/pat/s/曾經比:%s/pat/更爲熟悉。

無恥插頭:更多關於:g:s,你可能也有興趣在我的回答why :%s/^$//g is not equal to :g/^$/d in vim?

+0

':V /正則表達式/常態! 0D'是另一種選擇。 – Conner

+0

另外':v/regex/pu_ | -d' – Conner

0

在Linux上你可能會喜歡:

:%!grep STRING_YOU_WANT_TO_KEEP 
相關問題