2011-05-05 30 views
7

Estoy tratando de lograr una sustitución simple en vim pero no puedo hacerlo bien. Necesito eliminar, en un archivo completo, todas las líneas que coinciden con un patrón. El patrón es "algo *", que significa "algo" seguido de cualquier cosa hasta el final de la línea. Intenté :%s/pattern*\n//g y :%s/pattern*$//g sin éxito. Alguna idea?vim: reemplazar un patrón de línea por una línea no

¡Salud!

+2

FYI: El * se aplica al personaje anterior en su patrón, por lo que en su caso coincidirá con cero o más n's. –

+0

Correcto, siempre me confunden los caracteres de expansión de shell:/ – brafales

Respuesta

6

Use :g en lugar de :substitute.

:g/pattern/d 

eliminaría todas las líneas que coincidan con el patrón.

En cuanto al patrón, el suyo coincidirá con patter, pattern, patternn y así sucesivamente. Utilice el comodín . para unir cualquier carácter. Entonces su expresión regular debería ser pattern.*$ --- pero si desea eliminar las líneas por completo, el :g/pattern/d hace bien el truco.

+0

¡Gracias, justo lo que estaba buscando, tengo que acostumbrarme a leer más manuales! ;) – brafales

+0

@brafales, sí. ': g' es la otra mitad de la magia 'ex'. :) Una verdadera potencia oculta que puede hacer trucos interesantes. – progo

+2

Una adición: 'g/pattern/d _' (observe el guión bajo) actuará de la misma manera que' s /.* patrón. * \ N \ = // g', mientras que su versión estropeará los valores sin nombre, numerados (1-9) y, probablemente, algunos otros registros. – ZyX

0

Dependiendo de la versión de vim que está utilizando, es posible que tenga problemas con lo que voy a proponer:

:%s/pattern.*^V^M//g 

Para ^V, literalmente, golpeó ctrl-v, seguido por el ENTER (^ M) llave. ^V le permite ingresar un carácter literal sin que lo interprete el personaje.

+0

Punto significa «cualquier símbolo excepto nueva línea», por lo que no es necesario utilizar dicha colección. – ZyX

+0

Buen punto. Cambié de nuevo a la forma en que lo tenía antes. –

Cuestiones relacionadas