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.

thameera
fonte
:h count-items
Hotschke

Respostas:

94

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".

tommcdo
fonte
2
+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.

Dhruva Sagar
fonte
4
Não é gn?
yo '
11
@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.

Maçaneta
fonte
3

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.

Sven
fonte
2

:%s/pattern//g

Você verá o número de substituições na barra de status. Isso é quantas vezes o patternaparece. Em seguida, pressione upara desfazer as substituições.

Quincy Bowers
fonte
1

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).

Emile Vrijdags
fonte