Cómo canalizar el resultado de una búsqueda grep en un nuevo archivo vi


63

Estoy usando grep -e Peugeot -e PeuGeot carlist.txtpara buscar a través de carlist.txt y sacar algunos elementos y supuse que eso grep -e Peugeot -e PeuGeot carlist.txt | vilo canalizaría por mí, pero esto es lo que obtengo:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

Si desea incluir en un archivo, me vi primer uso en el archivo, y luego: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...incluirá la salida de cmd ... en el archivo (en la ubicación del cursor)
Olivier Dulac

No está claro qué quiere decir con un "archivo vi". Si desea que la salida vaya a un archivo, use grep ... > /tmp/foo. Puede agregar && vi /tmp/fooal final si desea editar ese archivo de inmediato.
LarsH

1
De hecho, no existe un "archivo vi". viopera en archivos de texto arbitrarios; los archivos en sí no están directamente asociados con vi. (O, como acabo de aprender, vi -hará vique opere sobre el contenido de stdin; vimhace esto, pero no todas las versiones de vido.)
Keith Thompson,

Respuestas:


111

Ejecutar vi o vim con '-' como argumento hace que lea el archivo para editarlo desde la entrada estándar. Por lo tanto:

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

Hará lo que necesite.


3
Para cualquiera que vea esto, atención: se espera de stdin. En algunos casos, tendrá que volver a dirigir a partir stderrde stdin, por ejemplo:valgrind my_file.out 2>&1 | vi -
Ciro Costa

Esto elimina los resaltados de búsqueda
MD. Mohiuddin Ahmed

3
@ MD.MohiuddinAhmed, ¿cómo espera mantener grepel color de búsqueda (compuesto por caracteres no imprimibles) dentro de Vim? Siempre puedes hacer una búsqueda en Vim.
Comodín el

Pensé que podíamos usar vim.org/scripts/script.php?script_id=302 plugin dentro de vim.
MD. Mohiuddin Ahmed



5

La redirección de salida también se puede usar así:

vi <(grep ...)

Incluso se pueden redirigir múltiples salidas de comandos, como si se hubieran guardado en archivos separados:

vim -d <(ls) <(ls -a)

1

En ~/bin/r:

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

en ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Entonces:

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

y tengo

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

en mi ~/.bashrc,tan

r- ls -l

0

Hay muchas formas efectivas de hacer lo que desea, ya sea dentro de vi (m) o fuera de vi (m).

Ejecute su comando, produzca un archivo (temporal), luego edite el archivo ( vea la respuesta de Joseph R. )

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

Ejecute su comando (en segundo plano) para producir un archivo temporal y edite el archivo, usando ": e!" para actualizar su archivo a medida que se produce (esto es útil para archivos de registro y otros archivos producidos por otro proceso, por ejemplo, cron?),

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

Ejecute vi (m), y ejecute un proceso secundario para crear el archivo temporal, y luego léalo,

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

O simplemente cambie al archivo,

:e /tmp/peugeot.txt

Ejecute vi (m) y use la doble explosión "!!" para que vi ejecute el comando secundario, tome los resultados y los inserte en la ubicación actual (sobrescribe la línea actual, así que asegúrese de tener una línea en blanco),

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

Y ahora puede escribir el archivo (si lo desea) en cualquier nombre de archivo,

:w /tmp/someotherfilename.txt

Y la respuesta de Petr Uzel también es buena,

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

Que lee de stdin

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.