题
我有一个类似于<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]
不隶属于 StackOverflow