我有类似于<Foobar Name='Hello There'/>
的内容,需要将单引号更改为双引号。 我尝试过:s/\'.*\'/\"\0\"
,但结果是<Foobar Name="'Hello There'"/>
。 将\0
替换为\1
只会在双引号内产生一个空字符串-我是否缺少某些特殊语法,需要使发现的字符串("Hello There")仅分配给\1
?
你需要使用分组:
:s/\'\(.*\)\'/\"\1\"
这种方式中,参数 1 (即 \1)将对应于由 \( 和 \) 分隔的任何内容。
%s/'\([^']*\)'/"\1"/g
你需要使用[^']*
而不是.*
,否则
'apples' are 'red'
将被转换为"apples' are 'red"
.\{-}
而不是.*
。请参见:help /\{-
。 - ib.s/\'/"/g
不是可以起作用吗?'
,双引号在双引号属性内应该是"
。当然,单引号也可能存在于双引号属性中,反之亦然... - ephemient提醒一下,如果要替换所有双引号为单引号,这是正确的正则表达式-基于rayd09上面的示例。
:%s/"\([^"]*\)"/'\1'/g
s/\'\(.*\)\'/"\1"/
但是,您可能会遇到意外匹配的问题。您是否可以在文件中仅将任何单引号替换为双引号?
你已经有了正确的想法--你想要把"\1"
作为替换语句,但是你需要先将"Hello There"部分放在第一个捕获组中(0是整个匹配)。尝试一下:
:%/'\(.*\)'/"\1"
按下Shift + V进入可视块模式。高亮显示您想要从中删除单引号的代码行。
然后在键盘上按:。
然后输入
s/'//g
按Enter键。
完成。你赢了。
假设您想在整个文件上执行此操作...
N模式:
ggvG$ [SHIFT+:]
X 模式:
'<,'>/'/" [RET]
cs
动作 -'
作为目标,"
作为替换。 - kejadlen