2011-11-01 10 views
7

Necesito reemplazar todas las instancias de/character con \ between < nombre de archivo> ... Etiquetas </filename>.Reemplazar todas las instancias de carácter entre etiquetas con vim

El archivo tiene como 2.000 de esas etiquetas y solo necesito reemplazar el/carácter dentro de esas etiquetas.

¿Cómo puedo hacer?

+0

@ewok Lo que lo convierte en uno diferente de los otros cientos de editor -¿preguntas relacionadas? – deviousdodo

+0

@ewok: está bastante bien establecido que las preguntas vim (particularmente las preguntas regulares como esta) caen directamente en la categoría de "herramientas de software comúnmente usadas por los programadores" explícitamente enumeradas como "sobre el tema" en la pregunta – jkerian

Respuesta

9

Editar: Teniendo en cuenta la nueva información, la sustitución de abajo probablemente funcionaría:

:%s/<filename>\zs.\{-}\ze<\/filename>/\=substitute(submatch(0), '\/', '\', 'g')/ 

Explicación:

  • %s: sustituto a través de todo el archivo
  • /<filename>: comienzo del patrón y estático texto para que coincida con
  • \zs: comienzo del texto correspondiente
  • .\{-}: cualquier carácter, no codicioso
  • \ze: final del texto coincidente
  • <\/filename>/: fin de la etiqueta y el patrón
  • \= objetivo: evaluar la sustitución como una expresión vim
  • substitute(submatch(0), '\/', '\', 'g')/: reemplazar todos / 's con \ en el texto combinado.

Respuesta original:

voy a suponer que quieres decir etiquetas de estilo XML aquí. Lo que haría es seleccionar visualmente el área en la que desea operar, luego usar el átomo de expresión regular \%V para operar solo en esa selección.

vit:s!\%V/!\\!g 

Debería hacer el truco. Tenga en cuenta que al pulsar :, vim añadirá automáticamente un rango para la selección visual, el comando real de sustitución se verá así:

:'<,'>s!\%V/!\\!g 
+0

Gracias, pero esto solo funciona en la etiqueta real seleccionada, no en todas las etiquetas, ¿verdad? – Oletros

+0

Correcto. Ese es un detalle que quizás quiera hacer un poco más obvio en su pregunta. –

+0

Gracias, ha funcionado como un encanto :) – Oletros

0

VIM tiene una aguda curva de aprendizaje, así como de expresiones regulares. Creo que este comando lo hará. Tienes que escapar de cada char con '\'.

:%s/\//\\/g 
+0

Gracias, pero esto reemplazará más/que necesito reemplazar, solo tengo que reemplazar el/adentro < filename > ... Oletros

+0

Oh, mi mal, solo quiero cambiar las rutas en las etiquetas. No sé la expresión regular en la parte superior de mi cabeza; intente consultar este tutorial: http://www.thatsquality.com/articles/how-to-match-and-replace-content-between-two-html-tags-using-regular-expressions – Noah

+0

Gracias, miraré eso – Oletros

2

Iff podemos asumir que las etiquetas son en líneas individuales, es simplemente:

Nota Introduzca ^M como CvCm (CqCm en las ventanas)

:g/<filename>/norm! /filename>/e^Mvity:let @"=substitute(@", '/', '\\', "g")^Mgvp 

Hmmm integración de la indirecta por Randy sobre el uso de \% V en un patrón hace que sea más sencillo:

:g/<filename>/norm! /filename>/e^Mvit:s#\%V/#\\#g^M 

I probado ambos. Whoo. Voy a explicar ahora. Espere.

  1. :g/<filename>/ - _For cada línea que contiene <filename>
  2. norm! - _execute comandos normales (mapeos ignorando)
  3. /filename/eIntroduzcasalto al final de la etiqueta abierta
  4. vit - seleccione el texto interno de th en la etiqueta de modo visual
  5. :s#\%V/#\\#gIntroduzca - _ON que la selección visual, realice la sustitución (sustituir por \/)
Cuestiones relacionadas