2009-06-10 10 views
6

Necesito sustituir una lista de palabras con una lista igualmente larga de palabras.¿Vim sustitución de una lista de palabras con otra misma lista de palabras?

Así, por ejemplo, usted tiene: "a", "b", "c", "d", "e", "f"

Y desea reemplazar cada palabra con la versión en mayúsculas de cada palabra: "a", "B", "C", "D", "E", "F"

sé cómo encontrar cada cadena usando la expresión regular: (un \ | b \ | c \ | d \ | e \ | f)

Sé que podría hacer una sustitución global para cada palabra. Pero cuando la longitud de las palabras se agranda, este enfoque se volvería irresponsable y poco elegante.

¿Hay alguna manera de hacer de alguna manera una sustitución global? Similar a:

:%s/\(a\|b\|c\|d\|e\|f\)/INSERT_REPLACEMENT_LIST/ 

No estoy seguro si esto es posible.

+1

Solo para satisfacer mi curiosidad, ¿te importaría contarle para qué sirve? Quiero decir, ¿para qué sirve, en la práctica? Nada me viene a la mente, así que me preguntaba. – Rook

+0

@Idigas, estoy haciendo un montón de refactorización en algunos malos códigos de Matlab. Me di cuenta de que el código utiliza como 20-30 globales y sus globales no son todos en mayúsculas o nombrados de tal manera que sean obviamente globales. -> SO Me gustaría cambiarles el nombre a todos para que sean mayúsculas. O posiblemente el mismo nombre, pero agregue "_g" después de cada nombre de variable. –

+0

@Idigas, con el tiempo implementaré el Matlab en C. Así que quiero comprender completamente y hacer que el código sea lo más elegante posible antes de convertir a C. –

Respuesta

9

Puede usar un diccionario de elementos asignados a sus reemplazos, luego use eso en el lado derecho de la búsqueda/reemplazo.

:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'} 
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g 

Ver :h sub-replace-\= y :h submatch(). Si desea meter eso en una línea, podría usar un diccionario literal.

:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g 

El ejemplo específico que diste de uppercasing letras sería más simple hecho como

:%s/[a-e]/\U\0/g 
+0

s/\\ (\ a \ + \\)/\ U \ 0/g para cambiar las secuencias de caracteres alfabéticos a mayúsculas. –

+1

Si te encuentras haciendo esto a menudo, defines una función vim para esto (http://stackoverflow.com/questions/765894/can-i-substitute-multiple-items-in-a-single-regular-expression-in -vim-or-perl/766093 # 766093) – rampion

+0

@Brian, ¿cuál es la "\ v" en su sustitución? –

2

:% s/(a ​​\ | b \ | c \ | d \ | e \ | f)/\ U \ 0/g

Cuestiones relacionadas