Existe uma maneira de contar o número de ocorrências de uma palavra em um arquivo?
68
É possível contar quantas vezes uma palavra ou padrão aparece em um arquivo? Às vezes, isso é útil para descobrir quantas vezes uma função foi chamada etc.
A resposta de Quincy é boa, mas há uma maneira exata de fazer isso que não requer a edição do buffer:
:%s/pattern//ng
Isso imprimirá uma mensagem como 3 matches on 2 lines, e nenhuma alteração será feita no seu buffer.
A nsinalização faz com que o :substitutecomando imprima o número de correspondências em vez de executar uma substituição real; o gsinalizador permite relatar várias correspondências por linha.
Outra coisa que pode ser útil para o seu caso de uso é imprimir todas as linhas que correspondem a um padrão:
:global/pattern/print
que pode ser reduzido para:
:g/pattern
Esse é um dos usos mais simples do :globalcomando (que é incrivelmente poderoso). Simplesmente imprime todas as linhas correspondentes patterne, em seguida (se houver mais de uma linha), você pressiona Enterou digita outro comando para fazê-lo desaparecer.
Um pouco de trivialidades: Este comando é a origem do nome grep, como seria comumente descrito como g/re/p, onde resignifica "expressão regular".
+1 Esta é uma resposta bastante agradável, no local e razoavelmente detalhada ao mesmo tempo. Espero que a maioria das perguntas obtenha essas respostas! :)
yo '
Ótima resposta e curiosidades incríveis!
BiBi
Eu tenho que fazer isso talvez 2-3 vezes por ano e nunca me lembro da sintaxe, então é para a máquina de pesquisa, sempre. Só queria dizer obrigado por esta resposta clara, porque ela está lá para mim mais de uma vez e, há alguns anos, me salvou daquela página horrível da wikia! (wikia, não o conteúdo da página)
será
11
Pouco menor: o comando g/re/pé realmente de ed, não vi. O Grep é anterior ao vi em alguns anos.
Será
Eu tenho um nnoremap <leader>n :%s///gn<CR>mapeamento. Então, pressiono <leader>npara contar as ocorrências do padrão pesquisado anteriormente. Eu uso isso surpreendentemente frequentemente.
Rolf
15
:%s/pattern//nA nbandeira no final diz :sao comando para relatar o número de correspondências e não substituir efetivamente. Leia :h :s_flagspara mais detalhes.
@yo 'Sim, embora g seja apenas outra bandeira, você também gostaria de usar gse achar que pode haver mais de uma correspondência por linha, o que geralmente é verdade. Para os fins da pergunta, no entanto, a bandeira né mais importante.
Dhruva Sagar
5
Primeiro use /para procurar uma regex e, em seguida,
:%s///gn
É o mesmo que a resposta de Dhurva, exceto que a.) É mais fácil de usar (já que você pode visualizar os resultados do que o seu regex corresponde primeiro) eb). Corresponde globalmente ao gsinalizador para contar todas as ocorrências.
Graças a este PR https://github.com/vim/vim/pull/4317 , cada comando de pesquisa mostra estatísticas de pesquisa (como posição de correspondência atual e número de correspondências) no vim 8.1.1270. Certifique-se de remover Sda variável shortmess.
Um mapeamento que eu adicionei ao meu .vimrc com base nas respostas aqui:
" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>
" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>
Um pouco de explicação, espero que útil para os vimmers mais recentes:
<c-r><c-w> insere a palavra sob o cursor na linha de comando, útil em várias ocasiões.
A <c-u>é necessária para remover o inseridas automaticamente '<,'>
quando se pressiona :no modo visual e indo para a linha de comando. O
*registro contém a (última) seleção visual, <c-r>*
insere o conteúdo do *registro na linha de comando (também pode ser usado no modo de inserção).
:h count-items
Respostas:
A resposta de Quincy é boa, mas há uma maneira exata de fazer isso que não requer a edição do buffer:
Isso imprimirá uma mensagem como
3 matches on 2 lines
, e nenhuma alteração será feita no seu buffer.A
n
sinalização faz com que o:substitute
comando imprima o número de correspondências em vez de executar uma substituição real; og
sinalizador permite relatar várias correspondências por linha.Outra coisa que pode ser útil para o seu caso de uso é imprimir todas as linhas que correspondem a um padrão:
que pode ser reduzido para:
Esse é um dos usos mais simples do
:global
comando (que é incrivelmente poderoso). Simplesmente imprime todas as linhas correspondentespattern
e, em seguida (se houver mais de uma linha), você pressionaEnter
ou digita outro comando para fazê-lo desaparecer.Um pouco de trivialidades: Este comando é a origem do nome
grep
, como seria comumente descrito comog/re/p
, ondere
significa "expressão regular".fonte
g/re/p
é realmente deed
, nãovi
. O Grep é anterior ao vi em alguns anos.nnoremap <leader>n :%s///gn<CR>
mapeamento. Então, pressiono<leader>n
para contar as ocorrências do padrão pesquisado anteriormente. Eu uso isso surpreendentemente frequentemente.:%s/pattern//n
An
bandeira no final diz:s
ao comando para relatar o número de correspondências e não substituir efetivamente. Leia:h :s_flags
para mais detalhes.fonte
gn
?g
se achar que pode haver mais de uma correspondência por linha, o que geralmente é verdade. Para os fins da pergunta, no entanto, a bandeiran
é mais importante.Primeiro use
/
para procurar uma regex e, em seguida,É o mesmo que a resposta de Dhurva, exceto que a.) É mais fácil de usar (já que você pode visualizar os resultados do que o seu regex corresponde primeiro) eb). Corresponde globalmente ao
g
sinalizador para contar todas as ocorrências.fonte
Graças a este PR https://github.com/vim/vim/pull/4317 , cada comando de pesquisa mostra estatísticas de pesquisa (como posição de correspondência atual e número de correspondências) no vim 8.1.1270. Certifique-se de remover
S
da variávelshortmess
.fonte
:%s/pattern//g
Você verá o número de substituições na barra de status. Isso é quantas vezes o
pattern
aparece. Em seguida, pressioneu
para desfazer as substituições.fonte
Um mapeamento que eu adicionei ao meu .vimrc com base nas respostas aqui:
Um pouco de explicação, espero que útil para os vimmers mais recentes:
<c-r><c-w>
insere a palavra sob o cursor na linha de comando, útil em várias ocasiões.A
<c-u>
é necessária para remover o inseridas automaticamente'<,'>
quando se pressiona:
no modo visual e indo para a linha de comando. O*
registro contém a (última) seleção visual,<c-r>*
insere o conteúdo do*
registro na linha de comando (também pode ser usado no modo de inserção).fonte