2009-07-22 18 views
29

Tengo un archivo de registro con la cadena "ERROR" en algunas líneas. Quiero eliminar cada línea que no tiene tiene ERROR para que pueda ver exactamente lo que necesita reparación. Iba a hacer algo como lo siguiente en vim:regex con concordancia negativa (es decir, buscar cadena que _no coincida con regex)

% s/(ERROR) //

para reemplazar líneas no relacionados con errores con una cadena vacía.

no creo que expresiones regulares estándar pueden hacer esto, pero tal vez me equivoque ...

Respuesta

50

utilizar el comando :g! eliminar todas las líneas que no coincide.

:g!/ERROR/d 
+23

': v/ERROR/d' es equivalente – rampion

0

una expresión regular coincidente negativo utilizará^ Para por ejemplo. [^ E] coincidirá con todo, excepto E.

+3

Es cierto, pero una expresión regular de este tipo coincidirá con cada * carácter * que no es E, que es diferente de todas las * líneas * que no contienen E. Además, tal la coincidencia negativa es incómoda para extenderse más allá de un personaje. –

1

si en * nix, puede utilizar grep -v o awk

awk '!/ERROR/' file | more 

en una máquina Windows, puede utilizar findstr

findstr /v /c:ERROR file | more 
8

En vim, puede ejecutar cualquier comando de filtro en el texto en el búfer. Por ejemplo,

:%!grep ERROR 

reemplazará el búfer completo con solo las líneas que coincidan con la expresión regular dada.

Esto es útil para más que solo grep, por ejemplo, puede ordenar las líneas en el búfer con :%!sort. O bien, puede hacer lo mismo para cualquier rango de texto utilizando el comando V para marcar el bloque y luego :!filter-command (vim completará automáticamente '<,'> para que indique el bloque actualmente marcado).

+0

+1 para un comando que no requiere dejar vim/redirigir a un archivo diferente –

+0

Quizás no sea el mejor de los ejemplos, ya que ': grep' y': sort' tienen significados incorporados en Vim (que son diferentes a ':! grep' y':! sort', solo para ser confuso). – ephemient

1

Utilizando un negative lookahead trabajado.

+7

No es una respuesta muy útil sin un ejemplo: ':% s/^ \ (\ ERROR \) \ @! $ \ N // g'. En Vim, el '\ @!' Es el indicador negativo de anticipación, no el formato '(?!)' De ese enlace. La respuesta ': g!' Es más fácil. – atomicules

+0

Estoy de acuerdo con @atomicules, pero aún así estoy votando la respuesta de Alexander porque 'lookahead negativo' es un término útil para seguir buscando en la web. –

Cuestiones relacionadas