Busque una cadena y obtenga el recuento en el editor vi


105

Quiero buscar una cadena y encontrar el número de ocurrencias en un archivo usando el editor vi.


11
La respuesta seleccionada ( :g/xxxx/d) es terrible, peligrosa e inferior a otras en esta página. Anule la selección.
Bruno Bronosky

1
Estoy de acuerdo y solo le dice 'líneas eliminadas' no 'apariciones eliminadas'
user1709076

Respuestas:


4
:g/xxxx/d

Esto eliminará todas las líneas con patrón e informará cuántas se eliminaron. Deshacer para recuperarlos después.


6
Por supuesto, puede omitir la "d" para no tener que hacerlo en la operación.
Torre

15
Tenga en cuenta que esto solo le dice cuántas líneas, no cuántas ocurrencias. Creo que dirk's es una mejor solución.

4
Mi solución a continuación cuenta correctamente varias ocurrencias dentro de una línea y no hay nada que deshacer.
Mohit Chakraborty

6
Muy peligroso: o
Ankit Zalani

1
No se supone que esta sea la respuesta aceptada / más popular. ¿Qué hacen los moderadores de SO? :(
user1412066


121

Necesitas la nbandera. Para contar palabras, use:

:%s/\i\+/&/gn   

y una palabra en particular:

:%s/the/&/gn        

Ver count-items sección de documentación.

Si simplemente escribe:

%s/pattern/pattern/g

luego, la línea de estado también le dará el número de coincidencias en vi.


Parece que esta respuesta es para usuarios de Vim y no para Vi :(
kadeshpa

¿Solo tiene vi en su sistema? ¿Cual version?
dirkgently

Alguien etiquetó su pregunta con vim en ella ... La eliminé.
ojblass

38

:% s / string / string / g dará la respuesta.


Que mejor respuesta. +5 si es posible
ojblass

Supongo que funcionaría solo cuando no se usa '. *' En el patrón
AK

10
No es necesario repetir la cadena, solo hazlo %s/string//ng.
slm

23

(similar a lo que dijo Gustavo, pero adicionalmente :)

Para cualquier búsqueda anterior , puede hacer simplemente:

:%s///gn

No se necesita un patrón, porque ya está en el registro de búsqueda ( @/).

"%" - do s/en todo el archivo
"g" - Búsqueda global (con golpes múltiples en una sola línea)
"n" - evita que cualquier sustitución de s/- nada se borra! ¡nada debe deshacerse!
(ver: :help s_flagpara más información)

(De esta manera, funciona perfectamente con " Buscar texto seleccionado visualmente ", como se describe en vim-wikia tip171 )


3

utilizar

:% s / patrón / \ 0 / g

cuando la cadena del patrón es demasiado larga y no le gusta volver a escribirla.


1

Respuesta corta :

:% s / cadena-a-buscar // gn

Para aprender :

Hay 3 modos en el editor VI como se muestra a continuación ingrese la descripción de la imagen aquí

  • :que está entrando de Commanda Command-linemodo. Ahora, todo lo que escriba después :está en CLI (interfaz de línea de comandos)
  • %sespecifica todas las líneas. Especificar el rango como %medio hace sustitución en todo el archivo. La sintaxis para la sustitución de todas las ocurrencias es:%s/old-text/new-text/g
  • gespecifica todas las ocurrencias en la línea. Con la gbandera, puede hacer que se sustituya toda la línea. Si este gindicador no se utiliza, solo se sustituirá la primera aparición en la línea.
  • n especifica el número de apariciones de salida
  • //la barra doble representa la omisión de replacement text. Porque solo queremos encontrar.

Una vez que tenga el número de ocurrencias, puede presionar la Ntecla para ver las ocurrencias una por una.

Para encontrar y contar en un rango particular de línea número 1 a 10:

: 1,10s / hola // gn

  • Tenga en cuenta que el %archivo completo se repone con ,números de línea separados.

Para buscar y reemplazar en un rango particular de línea número 1 a 10:

: 1,10s / hola / hola / gn


0

Sugiero hacer:

  1. Busque con *para hacer una "búsqueda limitada" para lo que está debajo del cursor, o haga una /patternbúsqueda estándar .
  2. Úselo :%s///gnpara obtener el número de ocurrencias. O puede usar :%s///npara obtener el número de líneas con apariciones.

** Realmente pude encontrar un complemento que diera mensajes de "coincidir con N de N 1 en N 2 líneas" con cada búsqueda, pero por desgracia.

Nota: No se confunda con la complicada redacción del resultado. El primer comando podría darle algo como lo 4 matches on 3 linesque el último podría darle 3 matches on 3 lines. Si bien es técnicamente preciso, este último es engañoso y debería decir "coincidencia de 3 líneas". Entonces, como puede ver, realmente nunca hay necesidad de usar la última forma (solo 'n'). Obtiene la misma información, más claramente, y más usando el formulario 'gn'.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.