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.

kadeshpa
fuente
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.

Kevin Beck
fuente
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
181

EL camino es

:% s / patrón // gn

Gustavo
fuente
2
Esta es la respuesta más auténtica sin el uso de trucos de muerte excesiva.
user1412066
1
la mejor respuesta!
Paulo Luvisoto
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.

dirkgently
fuente
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.

Mohit Chakraborty
fuente
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 )

tron5
fuente
3

utilizar

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

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

Sungwon Jeong
fuente
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

Om Sao
fuente
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'.

Bruno Bronosky
fuente