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

32

我有类似于<Foobar Name='Hello There'/>的内容,需要将单引号更改为双引号。 我尝试过:s/\'.*\'/\"\0\",但结果是<Foobar Name="'Hello There'"/>。 将\0替换为\1只会在双引号内产生一个空字符串-我是否缺少某些特殊语法,需要使发现的字符串("Hello There")仅分配给\1

9个回答

74

如果你需要频繁进行这个操作,可以考虑使用surround.vim插件。你可以使用cs'"来更改引号。


有没有办法将这个映射到某个领导命令?我做不到:\ - Fuad Saud
你不需要将它映射到一个 leader 命令,因为它使用了一个带有两个参数的自定义 cs 动作 - ' 作为目标," 作为替换。 - kejadlen

23

你需要使用分组:

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

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


22

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

你需要使用[^']*而不是.*,否则

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


3
请使用.\{-}而不是.*。请参见:help /\{- - ib.

9
除非我有所遗漏,否则 s/\'/"/g 不是可以起作用吗?

那是我的妥协,但我感觉不太对,特别是如果属性内部有单引号。我不认为这种情况会发生在XML中,但未来可能会出现需要相同解决方案的其他情况。 - ravuya
单引号在单引号属性内应该是&apos;,双引号在双引号属性内应该是&quot;。当然,单引号也可能存在于双引号属性中,反之亦然... - ephemient

8

提醒一下,如果要替换所有双引号为单引号,这是正确的正则表达式-基于rayd09上面的示例。

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

2
你需要在你想要捕获的表达式部分加上圆括号。
s/\'\(.*\)\'/"\1"/

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


1

你已经有了正确的想法--你想要把"\1"作为替换语句,但是你需要先将"Hello There"部分放在第一个捕获组中(0是整个匹配)。尝试一下:

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


1

按下Shift + V进入可视块模式。高亮显示您想要从中删除单引号的代码行。

然后在键盘上按:。

然后输入

s/'//g

按Enter键。

完成。你赢了。


0

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

N模式:

ggvG$ [SHIFT+:]  

X 模式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接