我有一个类似于<Foobar Name='Hello There'/>和需要改变的单引号双引号。我试图:s/\'.*\'/\"\0\"但它结束了生产<Foobar Name="'Hello There'"/>。替换为\0\1只生产双引号中一个空字符串 - 是有一些特殊的语法我失踪,我需要做只找到字符串(“你好”)里面的引号分配给\1

有帮助吗?

解决方案

您需要使用分组:

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

此方式参数1(即,\ 1)将对应于任何由分隔\(和\)。

其他提示

还有 surround.vim ,如果你正在寻找做到这一点相当频繁。你会使用cs'"改变周围的报价。

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

您想以其它方式使用[^']*代替.*

'apples' are 'red'将得到转化为"apples' are 'red"

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

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

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

您需要把各地要捕获表达的一部分圆括号。

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

不过,您可能有无意的匹配问题。你也许可以简单地取代任何单引号与双引号的文件?

您已经有了正确的想法 - 你想拥有"\1"为您更换条款,但是你需要把捕获组1第一本“你好”部分(0是整场比赛)。尝试:

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

假设你想这样做对整个文件...

N模式:

ggvG$ [SHIFT+:]  

X模式:

'<,'>/'/" [RET]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top