2012-08-07 23 views
15

Creo que esta es una solución bastante simple, pero he estado tratando de encontrar una respuesta durante aproximadamente una hora y parece que no puede resolverlo.Reemplazo Vim Regex

que estoy tratando de hacer una búsqueda/reemplazo en Vim que reemplazaría a una serie de números que comienzan con 103 y tienen cuatro dígitos para 123 seguido por los mismos cuatro dígitos, como por ejemplo:

1033303 ->1233303
1033213 ->1233213

lo más cerca que he llegado es la siguiente:

%s/103\d\{4}/123\0/g 

Sin embargo, esto da como resultado el número completo de ser emparejado por el \0, tales como:

1033303 ->1231033303

Muchas gracias por cualquier ayuda

Respuesta

21

Estás muy cerca

%s/103\(\d\{4}\)/123\1/g 

El patrón entre \( y \) es una coincidencia parcial a la que se puede acceder por \1, \2 etc. en el orden de aparición. Consulte :help \( para obtener más información.

2

Utilice un grupo de captura:

%s/103\(\d\{4}\)/123\1/g 
1

Prueba esto:

%s#103\(\d\{4}\)#123\1#g 
6

Ahora w/o el grupo de captura!

:%s/103\ze\d\{4}/123/g 

\ze establecerá el final del partido allí. Esto permite que coincida con el patrón completo, pero solo hace la sustitución en una parte del mismo.

:h /\ze 
:h /\zs 
+0

¿Después de \ ze hacer el truco una vez después de que se ignora? – SergioAraujo

+0

Sí, evitaría más coincidencias en la misma línea –

+0

Esto funcionó aquí: ':% s, 103 \ ze. *, 123, g' cambiando el delimitador (rápido para escribir) y haciendo coincidir todos los caracteres posteriores con'. * 'Que será ignorado en la sustitución. – SergioAraujo

Cuestiones relacionadas