2011-09-03 15 views
7

Hay una operación de búsqueda y reemplazo que estoy tratando de hacer utilizando backreferencing y expresiones regulares en vim. Curiosamente, solo reconocerá el patrón si realizo una búsqueda pura, pero si realizo una búsqueda y lo reemplazo, me da un E486: error de patrón no encontrado.patrón encontrado en vim search, pero no en vim buscar y reemplazar?

que tienen un montón de llamadas a la función de la forma:

function(Nullable<double>(1.1), map[FOO]); 

donde foo es algo diferente nombre de la variable en cada línea. Quiero convertirlo en

function(othermap[ FOO ], map[FOO]); 

Si intento

:%s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 

Me da la "Patrón de error no encontrado". Incluso

:%s/Null.*\(map[\)\(.*\)\]//g 

no funcionará porque simplemente no reconoce el patrón. Pero si intento el siguiente comando con la misma expresión exacta de búsqueda:

/Null.*\(map[\)\(.*\)\] 

Se resalta correctamente. Después de lo cual, puedo hacer% s // othermap [\ 2], \ 1 \ 2] para hacer mi reemplazo. Así que pude hacer mi reemplazo después de todo, pero no puedo entender por qué el patrón se reconocería en un caso y no en el otro.

+0

Posible duplicado de [vim no buscar y reemplazar la frase simple que está claramente presente] (https://stackoverflow.com/questions/5289262/vim -no-busca-y-reemplaza-frase-simple-que-está-claramente-presente) –

Respuesta

9

Puedo reproducir el resultado usando copy'n'paste de su pregunta a mi sesión vim. El mensaje detallado consigo, sin embargo, es:

E486: Pattern not found: Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 

nota de que ha perdido la s/ al inicio.

Sin embargo, mirando más detenidamente en esto, el problema es un sin escapar [:

s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 
      ^
      |-- here; you need \[ to match the literal 

que no utilizan la notación %; Yo escribiría automáticamente:

:g/Null.*\(map\[\(.*\)\]\)/s//othermap[\2], \1/g 

Esto tiene una captura ligeramente diferente. Tampoco hubo necesidad de utilizar la barra invertida en \] en la cadena de reemplazo.

Sin embargo, este comando también funciona para mí:

:%s/Null.*\(map\[\(.*\)\]\)/othermap[\2], \1/g 
+0

oh, yo no sabía que también tenías que escapar del primer corchete. El comportamiento de los corchetes me resulta extraño, ya que a menudo parece funcionar en muchas situaciones, incluso cuando no me escapo. ¡Gracias! – bhh1988

Cuestiones relacionadas