29

我有类似的东西<Foobar Name='Hello There'/>,需要将单引号更改为双引号。我试过:s/\'.*\'/\"\0\"了,但它最终产生了<Foobar Name="'Hello There'"/>. 替换\0with\1只会在双引号内产生一个空白字符串 - 是否有一些我遗漏的特殊语法我只需要在引号内指定找到的字符串(“Hello There”)\1

4

8 回答 8

67

如果您希望经常这样做,还有round.vim 。你会cs'"用来改变周围的引号。

于 2010-01-20T21:10:23.190 回答
23

您需要使用分组:

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

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

于 2010-01-20T17:57:16.600 回答
18

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

您将要使用[^']*而不是.*其他方式

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

于 2010-01-20T18:08:55.540 回答
9

除非我错过了什么,否则不会s/\'/"/g工作?

于 2010-01-20T17:57:27.457 回答
7

仅供参考 - 用单引号替换所有双引号,这是正确的正则表达式 - 基于上面 rayd09 的示例

:%s/"\([^"]*\)"/'\1'/g
于 2010-07-07T16:05:39.597 回答
2

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

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

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

于 2010-01-20T17:57:11.543 回答
1

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

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

于 2010-01-20T17:57:58.780 回答
0

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

N模式:

ggvG$ [SHIFT+:]  

X 模式:

'<,'>/'/" [RET]
于 2012-06-16T08:55:54.457 回答