Pergunta

Eu tenho algo semelhante a <Foobar Name='Hello There'/> e precisa alterar as aspas únicas para aspas duplas. eu tentei :s/\'.*\'/\"\0\" Mas acabou produzindo <Foobar Name="'Hello There'"/>. Substituindo o \0 com \1 Produziu apenas uma corda em branco dentro das citações duplas - existe alguma sintaxe especial que estou perdendo que preciso fazer apenas a string encontrada ("olá lá") dentro das aspas atribuídas \1?

Foi útil?

Solução

Você precisa usar agrupamentos:

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

Dessa forma, o argumento 1 (ou seja, 1) corresponderá ao que for delimitado por (e ).

Outras dicas

Há também Surround.vim, se você deseja fazer isso com bastante frequência. Você usaria cs'" para mudar as citações circundantes.

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

Você vai querer usar [^']* ao invés de .* por outro lado

'apples' are 'red' seria convertido para "apples' are 'red"

A menos que eu esteja perdendo alguma coisa, não seria s/\'/"/g trabalhar?

Apenas um FYI - para substituir todas as cotações duplas por single, este é o regexp correto - com base no exemplo de Rayd09 acima

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

Você precisa colocar suportes redondos em torno da parte da expressão que deseja capturar.

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

Mas você pode ter problemas com a correspondência não intencional. Você pode simplesmente substituir qualquer citações por citações duplas em seu arquivo?

Você tem a ideia certa - você quer ter "\1" Como sua cláusula de substituição, mas você precisa colocar a parte "Hello Lá" no Capture Group 1 primeiro (0 é a partida inteira). Tentar:

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

Presumindo que você deseja fazer isso em um arquivo inteiro ...

N modo:

ggvG$ [SHIFT+:]  

Modo x:

'<,'>/'/" [RET]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top