Ich greife oft nach einer Reihe von Dateien, um eine Zeile zu finden, und grep gibt dann ein Ergebnis zurück. Anstatt den Dateinamen zu kopieren und in einen neuen Befehl einzufügen, möchte ich dieses eine Ergebnis mit einem Editor öffnen können. Etwas wie: grep foo | vim
. Gibt es eine Möglichkeit, dies in BASH zu tun?
16
vim
aus zu lesenSTDIN
:grep foo | vim -
Antworten:
Verwenden Sie
grep -l
diese Option, um nur den Dateinamen der übereinstimmenden Datei und nicht den übereinstimmenden Text abzurufen, und kombinieren Sie ihn dann mitvim
:quelle
-q
flag of verwendengrep
, um sicherzustellen, dass grep tatsächlich zu einer übereinstimmenden Datei geführt hat:grep -q patterns fnames && vim $(grep -l pattern fnames)
vi
sich das OP beschwert, vielleicht nicht.Sie können verwenden
quickfix
odererrorfile
in Funktionvim
:Vim öffnet die erste Datei in
/tmp/foo.list
und platziert den Cursor direkt in der Zeile, infoo
der er gefunden wurde. Sie können mit zur nächsten:cn
und mit zur vorherigen Instanz wechseln:cp
.Randnotiz : Wenn Sie bereits
vim
oder verwendengvim
, würde ich vorschlagen, die eingebautegrep
Funktionalität zu verwenden. Lesen Sie:help vimgrep
für weitere Informationen.quelle
Für die Suche im Projekt müssen Sie vim nicht bei Fugitive lassen
autocmd QuickFixCmdPost *grep* cwindow
Unten sehen Sie ein Beispiel für
:Ggrep config
quelle
EDIT: Nachdem ich Ihren Kommentar gelesen habe, stelle ich fest, dass ich die Frage anfangs nicht verstanden habe. Hier ist ein einfaches Skript, das Ihren Suchbegriff als Argument verwendet und zur Eingabe des Suchpfads auffordert. Wenn das Ergebnis nur in einer Datei gefunden wird, wird die Datei zum Bearbeiten am Speicherort des Suchergebnisses geöffnet.
quelle
@devnull hat die Antwort in diesem Kommentar richtig verstanden:
quelle
Um Anthons Antwort für einen Fall zu erweitern, in dem Sie mehr als eine Übereinstimmung haben, kann es in einigen Fällen hilfreich sein,
head -1
(aus dieser Antwort ) nur das erste Ergebnis auszuwählen:vim "$(grep -l STRING FILES|head -1)"
quelle
Wenn Sie einen langen Befehl ausführen, in dessen Mitte grep steht, können Sie dies auch tun
quelle