私は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コマンドを使用できません。ありがとうございました!
:global
質問で参照するコマンドは、実際にはリテラル文字列をとるだけでなく、正規表現を処理します。したがって、2つのブランチを持つ1つを考え出す必要があります。1つはJohn
用で、もう1つはDave
用です。出来上がり:
:g!/Dave\|John/d
この単純なものはJohnny
にも一致することに注意してください。おそらく一致をキーワード全体に制限したいと思うでしょう:
:g!/\<\(Dave\|John\)\>/d
正規表現はVimの強力な機能です。それらについてもっと学ぶことは価値があります。 :help regular-expression
。
以下はそれを行うべきです
: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
これを使って:
:%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