¿Hay alguna manera de contar el número de apariciones de una palabra en un archivo?

68

¿Es posible contar cuántas veces aparece una palabra o un patrón en un archivo? Esto a veces es útil para averiguar cuántas veces se ha llamado a una función, etc.

thameera
fuente
:h count-items
Hotschke

Respuestas:

94

La respuesta de Quincy está bien, pero hay una manera exacta de hacer esto que no requiere editar el búfer:

:%s/pattern//ng

Esto imprimirá un mensaje como 3 matches on 2 lines, y no se realizarán cambios en su búfer.

El nindicador hace que el :substitutecomando imprima el número de coincidencias en lugar de realizar una sustitución real; la gbandera permite informar múltiples coincidencias por línea.


Otra cosa que puede ser útil para su caso de uso es imprimir todas las líneas que coinciden con un patrón:

:global/pattern/print

que se puede acortar a:

:g/pattern

Este es uno de los usos más simples del :globalcomando (que es increíblemente poderoso). Simplemente imprimirá todas las líneas que coinciden pattern, y luego (si hay más de una línea), presione Entero escriba otro comando para que desaparezca.

Un poco de trivia: este comando es el origen del nombre grep, como se describiría comúnmente como g/re/p, donde resignifica "expresión regular".

tommcdo
fuente
2
+1 Esta es una respuesta bastante agradable, sobre el terreno y razonablemente detallada al mismo tiempo. ¡Esperemos que la mayoría de las preguntas obtengan tales respuestas! :)
yo '
Gran respuesta y asombrosas curiosidades!
BiBi
Tengo que hacer esto tal vez 2-3 veces al año y nunca recuerdo la sintaxis, por lo que es para la máquina de búsqueda, cada vez. Solo quería decir gracias por esta respuesta clara porque ha estado allí para mí más de una vez y, durante un par de años, ¡me ha salvado esa página de wikia espantosa! (Wikia, no el contenido de la página)
Será el
1
Minor bit: el comando g/re/pes en realidad de ed, no vi. Grep es anterior a vi por un par de años.
Será el
Tengo un nnoremap <leader>n :%s///gn<CR>mapeo Así que presiono <leader>npara contar las ocurrencias del patrón buscado anteriormente. Lo uso sorprendentemente a menudo.
Rolf
15

:%s/pattern//nLa nbandera al final le dice al :scomando que informe el número de coincidencias y que no sustituya realmente. Leer :h :s_flagspara más detalles.

Dhruva Sagar
fuente
44
¿No es así gn?
yo '
1
@yo 'Sí, aunque g es solo otra bandera, también querrás usarla gsi crees que puede haber más de una coincidencia por línea, lo que a menudo es cierto. A los fines de la pregunta, sin embargo, la bandera nes más importante.
Dhruva Sagar
5

Primero use /para buscar una expresión regular, luego

:%s///gn

Esto es lo mismo que la respuesta de Dhurva, excepto que a.) Es más fácil de usar (ya que puede obtener una vista previa de los resultados de lo que coincide con su expresión regular primero) y b.) Coincide globalmente con la gbandera para contar todas las ocurrencias.

Perilla de la puerta
fuente
3

Gracias a este PR https://github.com/vim/vim/pull/4317 , cada comando de búsqueda muestra estadísticas de búsqueda (como la posición de coincidencia actual y el número de coincidencias) en vim 8.1.1270. Asegúrese de eliminar Sde la variable shortmess.

Sven
fuente
2

:%s/pattern//g

Verá el número de sustituciones en la barra de estado. Esa es la cantidad de veces que patternaparece. Luego solo presione upara deshacer las sustituciones.

Quincy Bowers
fuente
1

Una asignación que agregué a mi .vimrc basada en las respuestas aquí:

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

Un poco de explicación, con suerte útil para los nuevos vimmers:

  • <c-r><c-w> inserta la palabra debajo del cursor en la línea de comando, útil en muchas ocasiones.

  • El <c-u>es necesario para eliminar el insertado automáticamente '<,'> al presionar :en modo visual e ir a la línea de comando. El *registro contiene la (última) selección visual, <c-r>* inserta el contenido del *registro en la línea de comando (también se puede usar en modo de inserción).

Emile Vrijdags
fuente