web-dev-qa-db-ja.com

vimを使用して、任意の文字列のセットに一致する行を除くすべての行を削除します

私はvimを使用して、特定の文字列に一致する行を除くすべての行を削除します。

:g!/ [エディターに残したい文字列]/d

よく働く。しかし、私が本当に欲しがり、どこにも見つからなかったのは、vimを使用して複数の文字列を除くすべてを削除する方法です。

たとえば、次の情報を含むファイルを開いているとします。

Dave came at 12PM
Lucy came at 11AM
Trish came at 5PM
John ate lunch at 2PM
Virgil left at 3PM
Dave left at 6PM

そして、デイブとジョンに言及しているイベントだけを残したいのですが、最終的にはどのvimコマンドを使用できますか?

Dave came at 12PM
John ate lunch at 2PM
Dave left at 6PM

Windowsのfindstrや* nixのその他のコマンドラインツールを使用できることはわかっていますが、私はかなり頻繁にvimを使用しており、これを実行するregexコマンドやvimコマンドを使用できません。ありがとうございました!

9
Dave

:global質問で参照するコマンドは、実際にはリテラル文字列をとるだけでなく、正規表現を処理します。したがって、2つのブランチを持つ1つを考え出す必要があります。1つはJohn用で、もう1つはDave用です。出来上がり:

:g!/Dave\|John/d

この単純なものはJohnnyにも一致することに注意してください。おそらく一致をキーワード全体に制限したいと思うでしょう:

:g!/\<\(Dave\|John\)\>/d

正規表現はVimの強力な機能です。それらについてもっと学ぶことは価値があります。 :help regular-expression

15
Ingo Karkat

以下はそれを行うべきです

:v/\v(Dave|John)/d

壊す

:v                  matches all lines not containing the search expression 
/\vDave|John        search expression
/d                  execute delete on all those lines 
6

これを使って:

:%s/^[^Dave|John].*\n//

意味:

%            means search the whole file
^            at the beginning of the line
[^Dave|John] something that isn't Dave nor John
.*           match anything
\n           new line character
//           replace with nothing
0
drk.com.ar