Wie führe ich eine inverse Suche in Vim durch? (d. h., ich erhalte Zeilen, die kein Muster enthalten)

Wie führe ich eine inverse Suche in Vim durch? (d. h., ich erhalte Zeilen, die kein Muster enthalten)

Mit grepkann ich grep -v "my search"alle Zeilen abrufen, ohne „meine Suche“ auszuführen.

MitsedIch kann sed '/baz/!s/foo/bar/g'Text in Zeilen ohne „baz“ ersetzen.

Gibt es eine Möglichkeit, dasselbe in Vim zu tun? Und ist es möglich, dies ohne die Syntax „s///“ und nur mit der Suchsyntax „/“ zu tun?

Antwort1

:g/pattern/

stimmt mit allen Zeilen überein, in denen das Muster gefunden wurde.

:v/pattern/

bewirkt das Gegenteil. :h globalWeitere Einzelheiten finden Sie unter.

Sie können es folgendermaßen verwenden:

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

um "Muster nicht gefunden - " vor jede Zeile zu stellen, die kein "Muster" hat oder

:v/pattern/s/nrettap/pattern

um „nrettap“ in jeder Zeile, die kein „Muster“ enthält, durch „Muster“ zu ersetzen.

Gekünstelte Beispiele, ja.

Antwort2

So suchen Sie nach den Zeilennichtmit foo, führen Sie beispielsweise Folgendes aus:

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

Quelle:http://vim.wikia.com/wiki/Suche_nach_Zeilen_ohne_Muster_und_andere_hilfreiche_Suchen

Antwort3

Verwenden des Befehls :vEdit Der traditionelle Ansatz zum Auffinden von Zeilen, die nicht mit einem Muster übereinstimmen, ist die Verwendung des:v-Befehl:

:v/Warning/p

Ein guter Trick beim Arbeiten mit einer großen Protokolldatei, aus der Sie möglichst viele irrelevante Zeilen herausfiltern möchten, bevor Sie mit der eigentlichen Suche beginnen, besteht darin, die Datei unter einem temporären Namen zu speichern und dort alle nicht übereinstimmenden Zeilen zu löschen:

:sav junk.log
:v/warning/d

Sie bearbeiten jetzt einen Klon Ihrer Originaldatei, aus dem alle Zeilen entfernt wurden, die nicht mit der „Warnung“ übereinstimmen, und Sie können ihn nach Belieben bearbeiten.

Referenz:https://vim.fandom.com/wiki/Suche_nach_Zeilen_ohne_Muster_und_andere_hilfreiche_Suchen

Antwort4

Ein anderer Ansatz ist die Verwendung von „external grep“. Aus dem Handbuch (: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.

Für mich grepprgist auf die Standardeinstellung (siehe mit ) eingestellt, :set grepprgdie die externe verwendet grep, und so könnte ich tun

:grep -v 'my_pattern' %

wobei %sich auf den Namen der aktuellen Datei bezieht (siehe :help :_%).

Anschließend können mit :copenbzw. :lopendie Ergebnisse in der Quickfix- bzw. Standortliste nachgeschlagen werden (je nachdem, ob :grepbzw. :lgrepverwendet wurde).

NOTIZ

Das externe Grep arbeitet immer auf demGerettetDatei und nicht im Puffer. Bedenken Sie das, wenn Sie inkonsistente Ergebnisse erhalten.

verwandte Informationen