¿Cómo puedo abrir un archivo que resulta de grep?

17

A menudo grep un montón de archivos para encontrar una línea, y luego grep devuelve un resultado. En lugar de copiar y pegar el nombre de archivo en un nuevo comando, me gustaría poder abrir ese resultado con un editor. Algo así como: grep foo | vim. ¿Hay alguna manera de hacer eso en BASH?

Jonathan
fuente
55
Usted fue bastante cerca, simplemente le dice vima leer STDIN:grep foo | vim -
devnull
2
Ver también unix.stackexchange.com/q/110146/22565
Stéphane Chazelas

Respuestas:

20

Úselo grep -lpara obtener el nombre del archivo correspondiente y no el texto correspondiente, luego combínelo con vim:

vim "$(grep -l some_pattern file_names)"
Anthon
fuente
Además, puede usar -qflag of greppara asegurarse de que grep haya resultado en algún archivo coincidente:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc
¿Debo hacer un comentario sobre los nombres de archivo con espacios?
Bernhard
@Bernhard Nunca puede doler, y también sobre aquellos con nuevas líneas y otros personajes especiales. Me reconocer el problema cuando vise queja, el PO no.
Anthon
No funciona si los archivos coincidentes tienen espacios en su camino
psuzzi
5

Puede usar quickfixo errorfilepresentar en vim:

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

Vim abrirá el primer archivo /tmp/foo.listy colocará el cursor directamente en la línea donde foose encontró. Puede ir a la siguiente instancia usando :cny la instancia anterior usando :cp.

Nota al margen : si ya está utilizando vimo gvim, entonces sugeriría usar su grepfuncionalidad incorporada . Leer :help vimgreppara más información.

Srinidhi
fuente
1

Para buscar en el proyecto no es necesario dejar vim con Fugitive

autocmd QuickFixCmdPost *grep* cwindow

A continuación puedes ver ejemplos de :Ggrep config

ingrese la descripción de la imagen aquí

goodniceweb
fuente
0

EDITAR: Después de leer su comentario, me doy cuenta de que inicialmente no entendí la pregunta. Aquí hay un script simple que toma su término de búsqueda como argumento y le solicita la ruta de búsqueda. Si el resultado se encuentra en un solo archivo, abre el archivo para editarlo en la ubicación del resultado de búsqueda.

#!/bin/bash

SRCHTRM="$1"

read -p "Where to search: " SRCHPATH

FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)

FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')

if [ "$FILEFOUNDCNT" -eq "1" ];then
    vi +/"$SRCHTRM" "$FILEAWK"
else
    echo "$1 was found in more than one file"
fi
Timothy Martin
fuente
Pero esto parece permitirme editar la salida de grep, pero lo que quiero hacer es editar el archivo con el nombre de archivo que devuelve grep.
Jonathan
0

@devnull obtuvo la respuesta correcta en este comentario:

Estabas bastante cerca, simplemente dile a vim que lea de STDIN:

grep foo | vim -

Noumenon
fuente
0

Para ampliar la respuesta de Anthon para un caso en el que tiene más de una coincidencia, puede ser útil en algunos casos usar head -1(de esta respuesta ) para seleccionar solo el primer resultado:vim "$(grep -l STRING FILES|head -1)"

EL_DON
fuente
0

Si está ejecutando un comando largo que tiene grep en algún lugar en el medio, también puede hacer

vim `command1 | grep whatever | awk '{do_something_else}'`
Greg
fuente