2010-06-23 7 views
19

Ocurre a veces que tengo que buscar en varios archivos de registro y rastreo en Windows y, en general, uso para el propósito VIM.Encuentra la primera línea que no coincide en VIM

Mi problema es que aunque todavía no puedo encontrar ninguna analógico de grep -v interior del VIM: encontrar en el tampón una línea de no coincidencia de expresión regular dada. P.ej. archivo de registro está lleno de líneas que en algún lugar en el medio contienen la frase all is ok y necesito encontrar la primera línea que no contiene all is ok.

Puedo escribir una función personalizada para eso, pero por el momento parece ser una exageración y es probable que sea más lenta que una solución nativa.

¿Hay alguna manera fácil de hacerlo en VIM?

Respuesta

13

puede utilizar vistazo detrás negativo operador @<!

por ejemplo, para encontrar todas las líneas que no contengan "a", utilice /\v^.+(^.*a.*$)@<!$

(\v simplemente hace que algunos operadores como ( y @<! no debe haber sido barra invertida escapó)

el método más simple consiste en eliminar todas las líneas que coincidan o no a juego el patrón (o :g/PATTERN/d:g!/PATTERN/d respectivamente)

+0

'/^.\+\(^.*todo está bien. * $ \) \ @ Dummy00001

+0

': g!/PATTERN/p' produce demasiada salida. para unos pocos archivos de línea mln que no es una opción. pero ': g!/PATTERN/d' parece muy útil, p. para trabajar con buffer leída de stdin, aún no guardada en un archivo. – Dummy00001

+0

Uhm ... obviamente el ': g!/PATTERN/d' para mi caso (ignore las líneas poco interesantes que forman PATTER) debe escribirse como': g/PATTERN/d' - sin! - para eliminar las líneas poco interesantes. – Dummy00001

2

yo sólo lograron un procedimiento algo torpe con el comando "g":

:%g!/search/p 

Esto dice a imprimir el que no encaja, líneas ... no estoy seguro si eso funcionó, pero terminó con el cursor colocado en la primera línea que no coincide.

(sustituya alguna otra cadena de "Search", por supuesto)

+2

Y ': v' es un sinónimo de': g! ', Por supuesto. – Cascabel

+0

@Jefromi: gracias por eso, había olvidado ': v'. –

5

estoy a menudo en su caso, por lo que a los archivos "limpios" los registros que utilizo:

:g/all is ok/d 

Su grep -v se puede lograr con

:v/error/d 

que eliminará todas las líneas que no contienen no de error.

19

Creo que si simplemente desea que su cursor termine en la primera línea que no coincida, puede usar visual como el comando en su comando global. Entonces:

:v/pattern/visual 

dejará el cursor en la primera línea que no coincida. O bien:

:g/pattern/visual 

dejará el cursor en la primera línea coincidente.

+1

el comando visual también se puede acortar a vi ... para que pueda hacer: v/pattern/vi –

+0

Esta es claramente la mejor respuesta. ¿Por qué no fue elegido? – histumness

+3

Encuentra la primera línea que no coincide desde el comienzo del archivo, pero no desde la posición actual del cursor. Use ':., $ V/pattern/vi' para buscar desde la posición del cursor. –

3

Probablemente ya sea demasiado tarde, pero creo que esto debería decirse en alguna parte.

Vim (desde la versión aproximadamente 7.4) viene con un complemento llamado LogiPat, que hace que la búsqueda de líneas que no contienen alguna cadena sea realmente fácil. Así que usando este plugin encontrar las líneas que no contengan all is ok se hace así:

:LogiPat !"all is ok" 

Y entonces se puede saltar entre el juego (o en este caso no se ajuste) líneas con n y N.

También puede utilizar las operaciones lógicas como & y | para unirse a diferentes cadenas en un patrón:

:LP !("foo"|"bar")&"baz" 

LP es la abreviatura de LogiPat, y este comando va a buscar líneas que contienen la palabra baz y don' t no contiene ni foo ni bar.

Cuestiones relacionadas