procure linhas que contenham um padrão, mas não contenham um segundo padrão

15

Preciso procurar linhas que contenham alguma palavra, mas que não contenham uma segunda palavra.

Por exemplo, encontre linhas que contenham a palavra "This", mas não a palavra "red"

de modo que, para um arquivo contendo essas linhas

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat

A pesquisa localizaria apenas a primeira e a terceira linhas.

Obrigado por qualquer conselho!

Leo Simon
fonte
Você pode usar o plug-in LogiPat que é distribuído com o Vims mais recente
Christian Brabandt

Respostas:

23

Você pode usar este comando para imprimir linhas contendo Thise não red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&separa as ramificações como uma lógica, ANDporque queremos as linhas que satisfazem as duas condições (ramificações),
  • \(.*This\)é o primeiro ramo, poderia simplesmente ser, Thismas é mais genérico dessa maneira,
  • \(.*red\)\@!é o segundo ramo, \@!significa "correspondência de largura zero se o átomo anterior não corresponder", como uma lógica NOT.

Em outras palavras:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'
romainl
fonte
Muito obrigado, isso é muito parecido com uma consulta através de texto formatado. Consegui usar isso para encontrar funções que faltam nos documentos.
21418 Joshua Detwiler
1

Dê uma olhada neste post.

Combine-o com a resposta @romainl e você poderá fazer o que quiser.

Exemplo: Digamos que eu queira adicionar consta às funções que não as possuem.

    handleChange = value => {

Script VIM:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/\1const \2/gc

Resultado:

    const handleChange = value => {

Explicação:

\([ ]*\)\(\w* = .*$\)

- me todas as linhas que tem word =

\&

- combinar regras

^\(\&\(.*const.*\)\@!.\)*$

- a linha não deve conter const.

ATOzTOA
fonte