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)"
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?
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.
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
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
@devnull obteve a resposta correta neste comentário:
You were rather close, simply tell vim to read from STDIN:
grep foo | vim -
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)"