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.