替换Vim中字符串的引号?

问题描述:

我有类似于<Foobar Name='Hello There'/>的东西,需要将单引号更改为双引号。我试过:s/\'.*\'/\"\0\",但最终产生了<Foobar Name="'Hello There'"/>。替换\0\1只在双引号内产生一个空字符串 - 是否有一些特殊的语法,我错过了,我只需要使引号内的找到的字符串(“你好有”)分配给\1替换Vim中字符串的引号?

你需要用分组:

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

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

您需要围绕您希望捕捉的表达部分放置括号。

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

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

除非我失去了一些东西,不会s/\'/"/g工作?

+0

这是我的妥协,但我觉得它不太对,特别是如果在属性中有单引号。我不认为这可能发生在XML中,但它可能发生在需要相同解决方案的道路上。 – ravuya 2010-01-20 17:59:29

+0

单引号属性中的单引号应该是''',双引号属性中的双引号应该是'"'。当然,单引号可能存在​​于双引号属性中,反之亦然...... – ephemient 2010-01-20 18:44:13

你有正确的想法 - 你想有"\1"作为你的替代条款,但你需要首先在捕获组1中放置“你好”部分(0是整个匹配)。尝试:

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

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

你将要使用的[^']*代替.*否则

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

+1

或者使用'。\ { - }'而不是'。*'。见':help/\ { - '。 – 2012-06-16 10:08:22

还有surround.vim,如果你正在寻找经常这样做。您将使用cs'"来更改周围的引号。

+0

感谢您使用surround.vim链接 - 我一直希望能够这样做。 – ThomasH 2011-04-21 08:41:06

+0

有没有办法将这个映射到一些领导者命令?我不能这样做:\ – 2014-01-17 08:26:12

+0

你不应该把它映射到一个领导命令,因为它使用一个自定义的'cs'运动和两个参数 - '''作为目标,'''作为更换 – kejadlen 2014-01-30 20:02:50

只是一个供参考 - 以取代单一的所有双引号,这是正确的正则表达式 - 基于以上

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

rayd09的例子假设你想这样做对整个文件...

N模式:

ggvG$ [SHIFT+:] 

X模式:

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