Mentre mi piace il vipe
approccio, ho trovato un modo ancora più interessante:fzf.
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | fzf -m | cat
...fornisce un bel elenco in cui posso cercare e alternare gli elementi con la tastiera e scompare completamente quando ho finito.
moreutils ha vipe
, che esegue semplicemente il normale editor di testo (vi o qualcosa del genere) come parte della pipeline. Tutte le righe che non elimini verranno riscritte nello stdout. (In generale, però, ottieni lo stesso risultato reindirizzando a un file temporaneo e modificando quel file.)
Puoi anche usare gvim
(e vim
) per questo. Inserisci gvim /dev/stdin
nella pipe e scrivi facendo :wq! /dev/stdout
quando hai finito di modificare.
Chiamare gvim come segue ti consente di scrivere e chiudere in modo più naturale con ZZ
:
gvim +'nmap ZZ :wq!<cr> | r /dev/stdin | 1d | file /dev/stdout'
Puoi crearne un alias o una funzione:
gvimp() {
gvim +'
nmap ZZ :wq!<cr>
r /dev/stdin
1d
file /dev/stdout
'
}
Ecco un esempio in cui ho cancellato le righe 4-7 e finito facendo ZZ
in modalità normale:
$ seq 1 10 | gvimp | sed -r 's/^|$/=/g'
=1=
=2=
=3=
=8=
=9=
=10=
EDIT:Vim regolare è un po' più complicato, perché utilizza stdin per l'input da tastiera e stdout per disegnare l'interfaccia utente. Tuttavia, puoi ancora usarlo aggiungendo un processo aggiuntivo. Reindirizza lo std* di vim al terminale e usi lo std* del processo padre per la pipe di dati.
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"
'
}
Il file temporaneo è necessario perché altrimenti l'output della pipe verrà mescolato con l'interfaccia utente di vim e potrebbe scomparire con essa quando vim esce.