Wobei ich den vipe
mag Ansatz habe ich einen noch cooleren Weg gefunden:fzf.
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | fzf -m | cat
...gibt eine schöne Liste, in der ich die Elemente mit der Tastatur suchen und umschalten kann, und verschwindet vollständig, wenn ich fertig bin.
moreutils hat vipe
, die einfach Ihren normalen Texteditor (vi oder so) als Teil der Pipeline ausführt. Alle Zeilen, die Sie nicht löschen, werden nach stdout zurückgeschrieben. (Im Allgemeinen erhalten Sie jedoch dasselbe Ergebnis, wenn Sie zu einer temporären Datei umleiten und diese Datei bearbeiten.)
Sie können auch gvim
verwenden (und vim
) dafür. Fügen Sie gvim /dev/stdin
ein in Ihre Pipe und schreiben Sie, indem Sie :wq! /dev/stdout
ausführen wenn Sie mit der Bearbeitung fertig sind.
Wenn Sie gvim wie folgt aufrufen, können Sie natürlicher schreiben und mit ZZ
schließen :
gvim +'nmap ZZ :wq!<cr> | r /dev/stdin | 1d | file /dev/stdout'
Sie können daraus einen Alias oder eine Funktion machen:
gvimp() {
gvim +'
nmap ZZ :wq!<cr>
r /dev/stdin
1d
file /dev/stdout
'
}
Hier ist ein Beispiel, wo ich die Zeilen 4-7 gelöscht und mit ZZ
abgeschlossen habe im normalen Modus:
$ seq 1 10 | gvimp | sed -r 's/^|$/=/g'
=1=
=2=
=3=
=8=
=9=
=10=
BEARBEITEN:Reguläres vim ist etwas kniffliger, da es stdin für Tastatureingaben und stdout zum Zeichnen der Benutzeroberfläche verwendet. Sie können es jedoch weiterhin verwenden, indem Sie einen zusätzlichen Prozess hinzufügen. Sie leiten die std* von vim zum Terminal um und verwenden die std* des übergeordneten Prozesses für die Datenpipeline.
vimp() {
bash -c '
terminal="/dev/$(ps -o tty= $$)"
tmp_out="$(mktemp)"
trap "rm \$tmp_out" EXIT
vim <(cat) < "$terminal" &> "$terminal" +"
file $tmp_out
set noreadonly
nmap ZZ :wq!<cr>
"
cat "$tmp_out"
'
}
Die temporäre Datei ist notwendig, weil sonst die Pipe-Ausgabe mit der Benutzeroberfläche von vim vermischt wird und mit ihr verschwinden könnte, wenn vim beendet wird.