Aunque me gusta el vipe
enfoque, he encontrado una forma aún más genial:fzf.
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | fzf -m | cat
... ofrece una buena lista en la que puedo buscar y alternar los elementos con el teclado y desaparece por completo cuando termino.
moreutils tiene vipe
, que solo ejecuta su editor de texto normal (vi o algo así) como parte de la canalización. Cualquier línea que no elimine se volverá a escribir en la salida estándar. (En general, sin embargo, se obtiene el mismo resultado al redirigir a un archivo temporal y editar ese archivo).
También puedes usar gvim
(y vim
) para esto. Insertar gvim /dev/stdin
en tu pipe, y escribe haciendo :wq! /dev/stdout
cuando termines de editar.
Llamar a gvim de la siguiente manera le permite escribir y cerrar de forma más natural con ZZ
:
gvim +'nmap ZZ :wq!<cr> | r /dev/stdin | 1d | file /dev/stdout'
Puedes hacer un alias o una función de eso:
gvimp() {
gvim +'
nmap ZZ :wq!<cr>
r /dev/stdin
1d
file /dev/stdout
'
}
Aquí hay un ejemplo donde eliminé las líneas 4-7 y terminé haciendo ZZ
en modo normal:
$ seq 1 10 | gvimp | sed -r 's/^|$/=/g'
=1=
=2=
=3=
=8=
=9=
=10=
EDITAR:vim regular es un poco más complicado, porque usa stdin para la entrada del teclado y stdout para dibujar la interfaz de usuario. Sin embargo, aún puede usarlo agregando un proceso adicional. Usted redirige el std* de vim a la terminal y usa el std* del proceso principal para la canalización de datos.
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"
'
}
El archivo temporal es necesario porque, de lo contrario, la salida de la canalización se mezclará con la interfaz de usuario de vim y podría desaparecer con ella cuando salga de vim.