2010-06-19 8 views
13

vi otras preguntas se trata de la búsqueda de la ocurrencia de orden n de una palabra/patrón, pero no pudo encontrar la manera usted realmente sustituir la ocurrencia de orden n de un patrón en vim. No es la manera obvia de discos de codificación todas las ocurrencias comoSustituto de la ocurrencia de orden n de una palabra en vim

:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g 

¿Hay una mejor manera de hacer esto?

+0

Al parecer hay en sed, pero no vim '' s ///: http://vim.1045645.n5.nabble.com/replace-nth-occurrence-on-each-line-like- sed-td1169460.html – keflavich

Respuesta

4

Usted puede hacer esto un poco más simple mediante el uso de búsquedas múltiples. El patrón vacío en los medios :s/pattern/repl/ comando Reemplazar los más recientes resultados de búsqueda.

:/word//word//word/ s//newWord/ 
or 
:/word//word/ s/word/newWord/ 

A continuación, puede repetir esto varias veces haciendo @:, o incluso [email protected]: para repetir el comando 10 veces más.

Alternativamente, si estuviera haciendo esto de forma interactiva Me gustaría hacer algo como:

3/word 
:s//newWord/r 

Eso sería encontrar la tercera vez que se palabra empezando por el cursor y luego realizar una sustitución.

+0

Hrm, todavía hay una serie de problemas con esto, si la primera palabra es la que estamos buscando, '3/la palabra "nos llevará a la cuarta aparición". Además, cuando probé la sustitución después de encontrar la n-ésima instancia, todavía sustituye la primera ocurrencia. –

+0

Vaya, sí, el ': s' necesita la bandera' r'. –

+0

'3/word' encontrará la tercera aparición comenzando en el cursor. Vaya a la parte superior del archivo con 'gg' si desea comenzar allí. Tenga en cuenta que '3/word' es equivalente a escribir'/word' tres veces, por lo que definitivamente encuentra la tercera ocurrencia. –

0

Bueno, si lo hace /gc entonces se puede contar el número de veces que se solicita la confirmación, y seguir adelante con el reemplazo cuando se llega a la enésima: D

+0

Sí, pero quiero sustituir la n-ésima ocurrencia sin la confirmación (como si tuviera que escribir un script para hacerlo). –

+4

Sería un dolor si quieres reemplazar la aparición número 100 haciendo tu camino ... –

8

Para obtener más información,

s/\%(\(pattern\).\{-}\)\{41}\zs\1/2/ 

también funciona para reemplazar ocurrencia 42th. Sin embargo, prefiero the solution given by John Kugelman que es más sencilla - incluso si no se limitará a la línea actual.

+0

@ Luc Hermitte: podría decirme qué significa '\%' en su respuesta. Parece que es un operador que VIM no puede reconocer. –

+2

Es como '\ (', pero dice que no se une lo que coincide con el paréntesis a '\ 1'. Ver': h/\% (', IIRC –

1

Esto responde a su pregunta real, pero no es su intención.

Se preguntó acerca de la sustitución de la enésima aparición de una palabra (pero parecía significar "dentro de una línea"). Aquí hay una respuesta para la pregunta, si alguien lo encuentra como lo hice =)

Para tareas extrañas (como la necesidad de reemplazar cada 12 aparición de "perro" por "loro"), me gusta usar grabaciones recursivas .

Primer espacio de grabación en la @q

qqq 

Ahora inicie una nueva grabación en q

qq 

A continuación, hacerlo de forma manual lo que quiere hacer (usando el ejemplo anterior, reemplace el 12 ocurrencia de "perro" con "loro"):

/dog 
nnnnnnnnnnn 

borrado "perro" y entrar en inserción

diwi 

tipo de loro

parrot 

Ahora reproducir su "@q" VACIO grabación

@q 

que no hace nada.

Por último, detener la grabación:

q 

Ahora su grabación en @q llama a sí mismo al final. Pero debido a que llama a la grabación por el nombre, ya no estará vacía. Por lo tanto, llame a la grabación:

@q 

Volverá a reproducir la grabación, luego al final, como el último paso, volverá a reproducirse. Repetirá esto hasta el final del archivo.

TLDR;

qq 
q 
/dog 
nnnnnnnnnnndiwiparrot<esc> 
@q 
q 
@q 
2

reemplazar cada N º ocurrencia de patrón en una línea con REPLACE.

:%s/\(\zsPATTERN.\{-}\)\{N}/REPLACE/ 
Cuestiones relacionadas