Suche nach Zeilen, die ein Muster enthalten, aber kein zweites Muster enthalten

15

Ich muss nach Zeilen suchen, die ein Wort, aber kein zweites Wort enthalten.

Suchen Sie beispielsweise nach Zeilen, die das Wort "This", aber nicht das Wort "red" enthalten.

so dass für eine Datei mit diesen Zeilen

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

Die Suche würde nur die erste und dritte Zeile finden.

Danke für jeden Rat!

Leo Simon
quelle
Sie können das LogiPat-Plugin verwenden, das mit neueren Vims
Christian Brabandt

Antworten:

23

Mit diesem Befehl können Sie Zeilen drucken, die Folgendes enthalten Thisund nicht red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&trennt die Zweige wie eine Logik, ANDweil wir die Linien wollen, die die beiden Bedingungen (Zweige) erfüllen,
  • \(.*This\)ist der erste Zweig, es könnte einfach sein, Thisaber es ist so allgemeiner,
  • \(.*red\)\@!ist der zweite Zweig, \@!bedeutet "Null-Breiten-Übereinstimmung, wenn das vorhergehende Atom nicht übereinstimmt", wie eine logische NOT.

Mit anderen Worten:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'
romainl
quelle
Vielen Dank, dies ähnelt einer Abfrage durch formatierten Text. Ich konnte dies verwenden, um Funktionen zu finden, bei denen Docstrings fehlen.
Joshua Detwiler
1

Schauen Sie sich diesen Beitrag an.

Kombiniere es mit @romainl answer und du kannst machen, was du willst.

Beispiel: Nehmen wir an, ich möchte a constzu den Funktionen hinzufügen , die sie nicht haben.

    handleChange = value => {

VIM-Skript:

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

Ausgabe:

    const handleChange = value => {

Erläuterung:

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

- hol mir alle leitungen die hat word =

\&

- Regeln kombinieren

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

- Die Zeile sollte nicht enthalten const.

ATOzTOA
quelle