.png)
Mit grep
kann ich grep -v "my search"
alle Zeilen abrufen, ohne „meine Suche“ auszuführen.
Mitsed
Ich 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 global
Weitere 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 grepprg
ist auf die Standardeinstellung (siehe mit ) eingestellt, :set grepprg
die 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 :copen
bzw. :lopen
die Ergebnisse in der Quickfix- bzw. Standortliste nachgeschlagen werden (je nachdem, ob :grep
bzw. :lgrep
verwendet wurde).
NOTIZ
Das externe Grep arbeitet immer auf demGerettetDatei und nicht im Puffer. Bedenken Sie das, wenn Sie inkonsistente Ergebnisse erhalten.