wyszukaj linie, które zawierają wzór, ale nie zawierają drugiego wzoru


15

Muszę wyszukać wiersze, które zawierają jakieś słowo, ale nie zawierają drugiego słowa.

Na przykład znajdź wiersze zawierające słowo „To”, ale nie słowo „czerwony”

tak że dla pliku zawierającego te linie

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

Wyszukiwanie zlokalizuje tylko pierwszą i trzecią linię.

Dziękuję za wszelkie porady!


Możesz użyć wtyczki LogiPat, która jest dystrybuowana z nowszymi Vimsami
Christian Brabandt

Odpowiedzi:


23

Możesz użyć tego polecenia, aby wydrukować wiersze zawierające, Thisa nie red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&rozdziela gałęzie jak logicznie, ANDponieważ chcemy linii, które spełniają dwa warunki (gałęzie),
  • \(.*This\)to pierwsza gałąź, może po prostu być, Thisale w ten sposób jest bardziej ogólna,
  • \(.*red\)\@!to druga gałąź, \@!oznacza „dopasowanie zerowej szerokości, jeśli poprzedni atom nie pasuje”, jak logiczne NOT.

Innymi słowy:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'

Wielkie dzięki, to jest bardzo podobne do zapytania poprzez sformatowany tekst. Byłem w stanie to wykorzystać, aby znaleźć funkcje, w których brakuje dokumentów.
Joshua Detwiler

1

Spójrz na ten post.

Połącz to z odpowiedzią @romainl i możesz robić, co chcesz.

Przykład: Powiedzmy, że chcę dodać a constdo funkcji, które ich nie mają.

    handleChange = value => {

Skrypt VIM:

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

Wynik:

    const handleChange = value => {

Wyjaśnienie:

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

- zdobądź mi wszystkie linie, które ma word =

\&

- łączyć zasady

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

- linia nie powinna zawierać const.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.