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