Usando o vim para excluir todas as linhas, exceto aquelas que correspondem a um conjunto arbitrário de strings

6

Eu uso o vim para remover todas as linhas, exceto aquelas que correspondem a uma string específica, por exemplo,

: g! / [string que quero permanecer no editor] / d

Funciona muito bem. Mas o que eu realmente quero, e não encontrei em lugar algum, é uma maneira de usar o vim para remover todos, exceto para várias strings.

Por exemplo, digamos que eu tenha um arquivo aberto com as seguintes informações:

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

e eu quero apenas ficar com eventos que mencionam Dave e John - qual comando vim eu poderia usar para terminar:

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

Eu percebo que eu posso usar ferramentas de linha de comando como findstr no Windows e outras no * nix, mas eu estou no vim com muita frequência e não consegui alguns com qualquer comando regex ou vim que faça isso. Obrigada!

    
por Dave 21.05.2014 / 20:23

3 respostas

13

O comando :global que você faz referência em sua pergunta, na verdade, não aceita apenas strings literais, ele lida com qualquer expressão regular. Então, você só precisa criar um que tenha duas ramificações, uma para John e outra para Dave . Voila:

:g!/Dave\|John/d

Note que este simplista também corresponderia a Johnny ; você provavelmente deseja limitar as correspondências para palavras-chave inteiras :

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

Expressões regulares são um recurso poderoso do Vim; Vale a pena aprender mais sobre eles. Comece por :help regular-expression .

    
por 21.05.2014 / 20:49
6

A seguir deve ser feita

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

Divisão

:v                  matches all lines not containing the search expression 
/\vDave|John        search expression
/d                  execute delete on all those lines 
    
por 21.05.2014 / 20:49
0

Use isto:

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

Significado:

%            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
    
por 21.05.2014 / 20:41