在Vim中替换字符串周围的引号?

时间:2010-01-20 17:53:42

标签: vim vi replace surround

我有类似于<Foobar Name='Hello There'/>的东西,需要将单引号更改为双引号。我尝试了:s/\'.*\'/\"\0\"但最终产生了<Foobar Name="'Hello There'"/>。用\0替换\1只会在双引号内产生一个空字符串 - 是否有一些特殊的语法我缺少我需要在引号内只创建找到的字符串(“Hello There”)标记分配给\1

8 个答案:

答案 0 :(得分:56)

还有surround.vim,如果你想要经常这样做的话。您可以使用cs'"更改周围的引号。

答案 1 :(得分:22)

您需要使用分组:

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

这样,参数1(即\ 1)将对应于由\(和\)分隔的任何内容。

答案 2 :(得分:14)

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

您需要使用[^']*代替.*否则

'apples' are 'red'会转换为"apples' are 'red"

答案 3 :(得分:8)

除非我遗漏了某些内容,否则s/\'/"/g不会工作?

答案 4 :(得分:6)

只是一个FYI - 用单个替换所有双引号,这是正确的正则表达式 - 基于rayd09上面的例子

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

答案 5 :(得分:2)

您需要在要捕获的表达式部分周围放置圆括号。

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

但是,您可能会遇到无意识匹配问题。您是否可以简单地用文件中的双引号替换任何单引号?

答案 6 :(得分:1)

你有正确的想法 - 你希望"\1"作为你的替换子句,但是你需要首先在捕获组1中放入“Hello There”部分(0是整个匹配)。尝试:

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

答案 7 :(得分:0)

假设您想在整个文件上执行此操作...

N模式:

ggvG$ [SHIFT+:]  

X模式:

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