2012-06-03 10 views
7

Estoy buscando una manera de reemplazar todos los puntos en una línea, excepto la última.Vim: Reemplazar todos los puntos, pero el último en una línea

Ejemplo:

Blah - whatever - foo.bar.baz.avi debe convertirse en
Blah - whatever - foo bar bar.avi

Dado que voy a tener más de una línea en el archivo y la cantidad de puntos varía en cada línea que estoy buscando una solución genérica y no es algo como "Reemplace las primeras X coincidencias" siendo X una constante.

+0

Sí, quiero reemplazar todos los puntos con espacios, excepto el que está entre el nombre del archivo y la extensión. – ThiefMaster

Respuesta

11

Esto parece hacer el truco:

%s/\.\(.*\.\)\@=/ /g 

\@= es una lookahead. Solo coincide con un punto final si hay alguna parada completa siguiente.

Ver :help zero-width.

+0

Oh mi, la sintaxis de vim para lookaheads etc. es fea. Me pregunto por qué no usaron la sintaxis PCRE, etc. usa – ThiefMaster

+0

@ThiefMaster: Sí ... estaba muy confundido por el hecho de que el patrón debe preceder al "operador" anticipado ... pero, sin embargo, son muy útiles :) –

+1

@ThiefMaster try ': perldo s/searchme/replaceme/g' de Perl5 regexen? También: http://vim.wikia.com/wiki/Perl_compatible_regular_expressions – sehe

6

Como una variante de la primera respuesta puede preferir esta sintaxis:

%s/\.\ze.*\./ /g 

Se nos dejó usted poner la afirmación de que haya un siguiente punto después de que el operador de búsqueda.

0

Otra forma en que podría ser útil para aprender (reemplace dentro selección visual) sería:
:g/^/normal $F.hv0:s/\%V\./ /g^M
donde ^M se introduce con CTRL-V, Introduzca.

Esto significa: para cada línea (g/^/) tipo $F. (ir al último punto), seleccionar visualmente de carácter a la izquierda hasta el inicio de la línea (hv0), y luego vuelva a colocar puntos (:s/\./ /g^M) sólo dentro selección visual (\%V)

Cuestiones relacionadas