Como posso abrir um arquivo que resulta do grep?

10

Costumo pegar muitos arquivos para encontrar uma linha e, em seguida, o grep retorna um resultado. Em vez de copiar e colar o nome do arquivo em um novo comando, gostaria de poder abrir esse resultado com um editor. Algo como: grep foo | vim . Existe uma maneira de fazer isso em BASH?

    
por Jonathan 17.02.2014 / 19:35

6 respostas

16

Use grep -l para obter apenas o nome do arquivo correspondente e não o texto correspondente e, em seguida, combine-o com vim :

vim "$(grep -l some_pattern file_names)"
    
por 17.02.2014 / 19:39
3

Você pode usar o recurso quickfix ou errorfile em vim :

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

O Vim abrirá o primeiro arquivo em /tmp/foo.list e posicionará o cursor diretamente na linha em que foo foi encontrado. Você pode ir para a próxima instância usando :cn e a instância anterior usando :cp .

Nota secundária : se você já estiver usando vim ou gvim , sugiro usar a funcionalidade grep inerente. Leia :help vimgrep para mais informações.

    
por 05.10.2014 / 17:22
0

EDIT: Depois de ler o seu comentário, percebo que não entendi a pergunta inicialmente. Aqui está um script simples que leva seu termo de pesquisa como um argumento e solicita o caminho para pesquisar. Se o resultado for encontrado em apenas um arquivo, ele abrirá o arquivo para edição no local do resultado da pesquisa.

#!/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
    
por 17.02.2014 / 20:09
0

Para pesquisa no projeto, não é necessário deixar o vim com Fugitivo

autocmd QuickFixCmdPost *grep* cwindow

Abaixo, você pode ver o exemplo de :Ggrep config

    
por 15.07.2015 / 09:04
0

@devnull obteve a resposta correta neste comentário:

You were rather close, simply tell vim to read from STDIN:

grep foo | vim -

    
por 19.10.2016 / 18:53
0

Para expandir a resposta de Anthon para um caso em que você tem mais de uma correspondência, pode ser útil, em alguns casos, usar head -1 (de esta resposta ) para selecionar apenas o primeiro resultado: vim "$(grep -l STRING FILES|head -1)"

    
por 09.08.2017 / 00:25

Tags