So leiten Sie das Ergebnis einer grep-Suche in eine neue vi-Datei

63

Ich grep -e Peugeot -e PeuGeot carlist.txtdurchsuche die Datei carlist.txt und ziehe einige Elemente heraus. Ich gehe davon aus, dass grep -e Peugeot -e PeuGeot carlist.txt | visie für mich durchgeleitet werden , aber das bekomme ich:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Lmedza
quelle
wenn Sie es in einer Datei enthalten sein sollen, würde ich dem ersten Gebrauch vi auf die Datei, und dann: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...wird die Ausgabe von cmd ... in die Datei aufnehmen (an der Position des Cursors)
Olivier Dulac
Es ist nicht klar, was Sie mit einer "vi-Datei" meinen. Wenn die Ausgabe in eine Datei gehen soll, verwenden Sie grep ... > /tmp/foo. Sie können && vi /tmp/fooam Ende hinzufügen, wenn Sie diese Datei sofort bearbeiten möchten.
LarsH
1
Tatsächlich gibt es keine "vi-Datei". viarbeitet mit beliebigen Textdateien; Die Dateien selbst sind nicht direkt zugeordnet vi. (Oder, wie ich gerade erfahren habe, vi -wird veranlasst vi, den Inhalt von zu bearbeiten stdin; vimtut dies, aber nicht alle Versionen von vi.)
Keith Thompson
Verwandte Themen: Wie bearbeite ich Inhalte aus der Standardeingabe? bei Vim SE
Kenorb

Antworten:

111

Wenn Sie vi oder vim mit '-' als Argument ausführen, wird die zu bearbeitende Datei von der Standardeingabe gelesen. Daher:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

werde tun was du brauchst.

Petr Uzel
quelle
3
Für jeden, der das sieht, Achtung: es erwartet von stdin. In einigen Fällen werden Sie von umleiten stderrzu stdin, zum Beispiel:valgrind my_file.out 2>&1 | vi -
Ciro Costa
Dadurch werden Suchmarkierungen entfernt
MD. Mohiuddin Ahmed
3
@ MD.MohiuddinAhmed, wie soll die Suchfarbe grep(bestehend aus nicht druckbaren Zeichen) in Vim bleiben ? Sie können immer nur in Vim suchen .
Wildcard
Ich dachte, wir können mit vim.org/scripts/script.php?script_id=302 Plugin in vim gehen.
MD. Mohiuddin Ahmed
11

Sie sollten die Ausgabeumleitung verwenden :

grep ... > newfile.txt && vi newfile.txt

Ich denke auch, dass Sie grepverbessert werden können:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt
Joseph R.
quelle
5

Die Ausgabeumleitung kann auch folgendermaßen verwendet werden:

vi <(grep ...)

Sogar mehrere Befehlsausgaben können umgeleitet werden, als ob sie in separaten Dateien gespeichert wären:

vim -d <(ls) <(ls -a)
musa
quelle
1

In ~/bin/r:

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

in ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Dann:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

und ich habe

r- () { "$@" | r; }

in meinem ~/.bashrc,so

r- ls -l
jdoch
quelle
0

Es gibt viele effektive Möglichkeiten, um das zu tun, was Sie wollen, entweder innerhalb von vi (m) oder außerhalb von vi (m).

Führen Sie Ihren Befehl aus, erstellen Sie eine (temporäre) Datei und bearbeiten Sie die Datei ( siehe Antwort von Joseph R. ).

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

Führen Sie Ihren Befehl (im Hintergrund) aus, um eine temporäre Datei zu erstellen, und bearbeiten Sie die Datei mit ": e!" um Ihre Datei zu aktualisieren, während sie erstellt wird (dies ist nützlich für Protokolldateien und andere Dateien, die von einem anderen Prozess erstellt werden, z. B. cron?),

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

Führen Sie vi (m) aus, und führen Sie einen untergeordneten Prozess aus, um die temporäre Datei zu erstellen, und lesen Sie sie dann.

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

Oder wechseln Sie einfach zu der Datei,

:e /tmp/peugeot.txt

Führe vi (m) aus und benutze den Doppelknall "!!" Damit vi den Befehl child ausführt, die Ergebnisse aufnimmt und an der aktuellen Position einfügt (überschreibt die aktuelle Zeile, vergewissern Sie sich also, dass Sie eine leere Zeile haben),

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

Und jetzt können Sie die Datei (wenn Sie möchten) in einen beliebigen Dateinamen schreiben,

:w /tmp/someotherfilename.txt

Und die Antwort von Petr Uzel ist auch gut,

grep -e "Peu[gG]eot" carlist.txt | vi -

Was von stdin liest

ChuckCottrill
quelle