.png)
Com grep
eu posso fazer um grep -v "my search"
para pegar todas as linhas sem "minha busca".
Comsed
Posso 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 global
para 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, grepprg
está 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 :copen
ou :lopen
para consultar os resultados nas listas de quickfix ou de localização (dependendo se foi :grep
ou :lgrep
foi usado, respectivamente).
OBSERVAÇÃO
O grep externo sempre funcionará nosalvouarquivo, e não no buffer. Tenha isso em mente ao obter resultados inconsistentes.