2010-01-20 19 views
23

Tengo algo parecido a <Foobar Name='Hello There'/> y necesito cambiar las comillas simples por comillas dobles. Intenté :s/\'.*\'/\"\0\" pero terminó produciendo <Foobar Name="'Hello There'"/>. Reemplazar el \0 con \1 solo produjo una cadena en blanco dentro de las comillas dobles - ¿hay alguna sintaxis especial que me falta que necesito para hacer que solo la cadena encontrada ("Hola allá") entre las comillas se asigne a \1?¿Reemplazar las comillas alrededor de las cadenas en Vim?

Respuesta

20

Es necesario utilizar agrupaciones:

:s/\'\(.*\)\'/\"\1\" 

De esta manera el argumento 1 (es decir, \ 1) se corresponderá con lo que está delimitada por \ (y \).

2

Debe colocar corchetes alrededor de la parte de la expresión que desea capturar.

s/\'\(.*\)\'/"\1"/ 

Pero, puede tener problemas con la coincidencia involuntaria. ¿Podría simplemente reemplazar cualquier comilla simple con comillas dobles en su archivo?

5

a menos que me falta algo, ¿no funcionaría s/\'/"/g?

+0

Ese fue mi compromiso, pero sentí que no estaba del todo bien, especialmente si había una sola comilla dentro del atributo. No creo que eso pueda suceder en XML, pero podría suceder en alguna otra situación que necesite esta misma solución. – ravuya

+0

Una comilla simple dentro de un atributo entre comillas simple debe ser ''' y una comilla doble dentro de un atributo de comillas dobles debe ser '"'. Por supuesto, una sola cita podría vivir dentro de un atributo de doble cita y viceversa ... – ephemient

1

Tiene la idea correcta: desea tener "\1" como su cláusula de reemplazo, pero primero debe colocar la parte "Hola" en el grupo de captura 1 (0 es la coincidencia completa). Proveedores:

:%/'\(.*\)'/"\1"

13

%s/'\([^']*\)'/"\1"/g

Usted tendrá que usar [^']* en lugar de .* lo contrario

'apples' are 'red' obtendría convertido a "apples' are 'red"

+1

O use '. \ {-}' en lugar de '. *'. Ver ': ayuda/\ {-'. –

48

También hay surround.vim, si usted está mirando para haz esto con bastante frecuencia Utilizaría cs'" para cambiar las comillas circundantes.

+0

Gracias por el enlace surround.vim: hace mucho que deseaba esto. – ThomasH

+0

¿hay alguna manera de asignar esto a algún comando de líder? No puedo hacerlo: \ –

+0

No debería necesitar asignar esto a un comando de líder, ya que está usando un movimiento 'cs' personalizado con dos argumentos -' '' como destino, y '" 'como el reemplazo. – kejadlen

6

Sólo un FYI - para reemplazar todas las comillas dobles con sencillo, se trata de la expresión regular correcta - basado en el ejemplo de arriba rayd09

:%s/"\([^"]*\)"/'\1'/g 
0

Suponiendo que quiere hacer esto en un archivo completo ...

Modo N:

ggvG$ [SHIFT+:] 

Modo X:

'<,'>/'/" [RET] 
Cuestiones relacionadas