Costumo grep um monte de arquivos para encontrar uma linha e, em seguida, grep retorna um resultado. Em vez de copiar e colar o nome do arquivo em um novo comando, eu gostaria de poder abrir esse resultado com um editor. Algo como: grep foo | vim
. Existe uma maneira de fazer isso no BASH?
17
vim
para lerSTDIN
:grep foo | vim -
Respostas:
Use
grep -l
apenas para obter o nome do arquivo do arquivo correspondente e não o texto correspondente; em seguida, combine-o comvim
:fonte
-q
sinalizador degrep
para garantir que o grep tenha realmente resultado em algum arquivo correspondente:grep -q patterns fnames && vim $(grep -l pattern fnames)
vi
se queixa, o OP talvez não.Você pode usar
quickfix
ouerrorfile
destacarvim
:O Vim abrirá o primeiro arquivo
/tmp/foo.list
e posicionará o cursor diretamente na linha em quefoo
foi encontrado. Você pode ir para a próxima instância usando:cn
e a instância anterior usando:cp
.Nota lateral : Se você já estiver usando
vim
ougvim
, sugiro usar suagrep
funcionalidade embutida. Leia:help vimgrep
para mais informações.fonte
Para pesquisar no projeto, não é necessário sair do vim com o Fugitive
autocmd QuickFixCmdPost *grep* cwindow
Abaixo você pode ver um exemplo de
:Ggrep config
fonte
EDIT: Depois de ler seu comentário, percebo que não entendi a pergunta inicialmente. Aqui está um script simples que usa seu termo de pesquisa como argumento e solicita o caminho a ser pesquisado. Se o resultado for encontrado em apenas um arquivo, ele abrirá o arquivo para edição no local do resultado da pesquisa.
fonte
@devnull obteve a resposta correta neste comentário:
fonte
Para expandir a resposta de Anthon para um caso em que há mais de uma correspondência, em alguns casos pode ser útil usar
head -1
( nesta resposta ) para selecionar apenas o primeiro resultado:vim "$(grep -l STRING FILES|head -1)"
fonte
Se você estiver executando um comando longo que tenha grep em algum lugar no meio dele, você também poderá executar
fonte