Como fazer uma busca inversa no Vim? (ou seja, obtenha linhas que não contenham padrão)

Como fazer uma busca inversa no Vim? (ou seja, obtenha linhas que não contenham padrão)

Com grepeu posso fazer um grep -v "my search"para pegar todas as linhas sem "minha busca".

ComsedPosso sed '/baz/!s/foo/bar/g'encontrar a substituição do texto nas linhas sem "baz".

Existe uma maneira de fazer a mesma coisa no Vim? E é possível fazer isso sem a sintaxe "s ///" e usando apenas a sintaxe de pesquisa "/"?

Responder1

:g/pattern/

corresponde a todas as linhas onde o padrão foi encontrado.

:v/pattern/

faz o oposto. Veja :h globalpara mais detalhes.

Você pode usá-lo assim:

:v/pattern/norm Ipattern not found - <CR>

acrescentar "padrão não encontrado -" a todas as linhas que não possuem "padrão" ou

:v/pattern/s/nrettap/pattern

para substituir "nrettap" por "pattern" em todas as linhas que não possuem "pattern".

Exemplos inventados, sim.

Responder2

Para procurar as linhasnãocontendo foo, por exemplo, faça:

/^\(\(.*foo.*\)\@!.\)*$

Fonte:http://vim.wikia.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches

Responder3

Usando o comando :vEdit A abordagem tradicional para encontrar linhas que não correspondem a um padrão é usar o:v comando:

:v/Warning/p

Um truque interessante ao trabalhar com um arquivo de log grande onde você deseja filtrar o máximo possível de linhas irrelevantes antes de iniciar sua pesquisa real é salvar o arquivo com um nome temporário e excluir todas as linhas não correspondentes:

:sav junk.log
:v/warning/d

Agora você está editando um clone do seu arquivo original com todas as linhas que não correspondem ao "aviso" removidas e você pode editá-lo à vontade.

Referência:https://vim.fandom.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches

Responder4

Outra abordagem é fazer "grep externo"; do manual (:help :grep):

5.2 External grep

Vim can interface with "grep" and grep-like programs (such as the GNU
id-utils) in a similar way to its compiler integration (see |:make| above).

                                *:gr* *:grep*
:gr[ep][!] [arguments]  Just like ":make", but use 'grepprg' instead of
            'makeprg' and 'grepformat' instead of 'errorformat'.
            When 'grepprg' is "internal" this works like
            |:vimgrep|.  Note that the pattern needs to be
            enclosed in separator characters then.
            If the encoding of the program output differs from the
            'encoding' option, you can use the 'makeencoding'
            option to specify the encoding.

                                *:lgr* *:lgrep*
:lgr[ep][!] [arguments] Same as ":grep", except the location list for the
            current window is used instead of the quickfix list.

Para mim, grepprgestá definido como padrão (veja com :set grepprg) que usa o external grep, e assim eu poderia fazer

:grep -v 'my_pattern' %

onde %se refere ao nome do arquivo atual (consulte Recursos :help :_%).

Depois disso, pode-se usar :copenou :lopenpara consultar os resultados nas listas de quickfix ou de localização (dependendo se foi :grepou :lgrepfoi usado, respectivamente).

OBSERVAÇÃO

O grep externo sempre funcionará nosalvouarquivo, e não no buffer. Tenha isso em mente ao obter resultados inconsistentes.

informação relacionada