views:

486

answers:

7

I have something akin to <Foobar Name='Hello There'/> and need to change the single quotation marks to double quotation marks. I tried :s/\'.*\'/\"\0\" but it ended up producing <Foobar Name="'Hello There'"/>. Replacing the \0 with \1 only produced a blank string inside the double quotes - is there some special syntax I'm missing that I need to make only the found string ("Hello There") inside the quotation marks assign to \1?

+1  A: 

You need to put round brackets around the part of the expression you wish to capture.

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

But, you might have problems with unintentional matching. Might you be able to simply replace any single quotes with double quotes in your file?

martin clayton
+2  A: 

You need to use groupings:

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

This way argument 1 (ie, \1) will correspond to whatever is delimited by \( and \).

ruibm
+3  A: 

unless i'm missing something, wouldn't s/\'/"/g work?

tosh
That was my compromise, but I felt that it wasn't quite right, especially if there were a single quote inside the attribute. I don't think that can happen in XML, but it might happen in some other situation down the road that needs this same solution.
ravuya
A single quote inside a single-quoted attribute should be `'` and a double quote inside a double-quoted attribute should be `"`. Of course a single quote might live inside a double-quoted attribute and vice versa...
ephemient
+1  A: 

You've got the right idea -- you want to have "\1" as your replace clause, but you need to put the "Hello There" part in capture group 1 first (0 is the entire match). Try:

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

Josh Petrie
+5  A: 

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

You will want to use [^']* instead of .* otherwise

'apples' are 'red' would get converted to "apples' are 'red"

rayd09
+3  A: 

There's also surround.vim, if you're looking to do this fairly often. You'd use cs'" to change surrounding quotes.

kejadlen
+1  A: 

Just an FYI - to replace all double quotes with single, this is the correct regexp - based on rayd09's example above

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