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