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.
Lmedza
fuente
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.

Petr Uzel
fuente
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
11

Debe usar la redirección de salida :

grep ... > newfile.txt && vi newfile.txt

Además, creo que tu grepse puede mejorar:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt
Joseph R.
fuente
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)
musa
fuente
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
jthill
fuente
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

ChuckCottrill
fuente