¿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.
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".
+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.
@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.
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.
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.
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).
:h count-items
Respuestas:
La respuesta de Quincy está bien, pero hay una manera exacta de hacer esto que no requiere editar el búfer:
Esto imprimirá un mensaje como
3 matches on 2 lines
, y no se realizarán cambios en su búfer.El
n
indicador hace que el:substitute
comando imprima el número de coincidencias en lugar de realizar una sustitución real; lag
bandera 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:
que se puede acortar a:
Este es uno de los usos más simples del
:global
comando (que es increíblemente poderoso). Simplemente imprimirá todas las líneas que coincidenpattern
, y luego (si hay más de una línea), presioneEnter
o escriba otro comando para que desaparezca.Un poco de trivia: este comando es el origen del nombre
grep
, como se describiría comúnmente comog/re/p
, dondere
significa "expresión regular".fuente
g/re/p
es en realidad deed
, novi
. Grep es anterior a vi por un par de años.nnoremap <leader>n :%s///gn<CR>
mapeo Así que presiono<leader>n
para contar las ocurrencias del patrón buscado anteriormente. Lo uso sorprendentemente a menudo.:%s/pattern//n
Lan
bandera al final le dice al:s
comando que informe el número de coincidencias y que no sustituya realmente. Leer:h :s_flags
para más detalles.fuente
gn
?g
si 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 banderan
es más importante.Primero use
/
para buscar una expresión regular, luegoEsto 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
g
bandera para contar todas las ocurrencias.fuente
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
S
de la variableshortmess
.fuente
:%s/pattern//g
Verá el número de sustituciones en la barra de estado. Esa es la cantidad de veces que
pattern
aparece. Luego solo presioneu
para deshacer las sustituciones.fuente
Una asignación que agregué a mi .vimrc basada en las respuestas aquí:
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).fuente