单引号中的双引号,反之亦然
Posted
技术标签:
【中文标题】单引号中的双引号,反之亦然【英文标题】:Double quotes in single quotes and vice versa 【发布时间】:2012-04-25 03:51:13 【问题描述】:我经常发现自己反引号:从双引号 ""
到单引号 ''
和从单引号 ''
到双引号 @987654324 @。
我知道有一种方法可以将单引号切换为双引号::%s/'\(\([^']*\)\)'/"\1"/g
还有一种将双引号切换为单引号的方法::%s/"\(\([^"]*\)\)"/'\1'/g
但我如何一起进行这两项操作,而不在第二次交换中包含第一个交换的引号?
【问题讨论】:
在单个命令中使用哈希映射替换多个单词:%s/\/\='foo':'bar' ,'bar':'baz','baz':'foo'[submatch(0)]/gc .. 这里 foo -> bar, bar -> baz, baz -> foo. 【参考方案1】:如果字符串文字中没有转义引号,则不需要 确保正确的引号配对,可以使用命令
:%s/['"]/\="'\""[submatch(0)!='"']/g
【讨论】:
`@ib,转义引号是什么意思?您的正则表达式也适用于您自己的正则表达式(带有转义引号?) - btw tnx :) @Remonn:我的意思是在您操作的文本中引用转义语法。如果您在 Vim 脚本字符串文字上运行这些替换,那么"one\"two"
将更改为 'one\'two'
,它与原始文字表示的字符串不同。【参考方案2】:
我通常使用不太可能出现在文本中的中间字符串,例如我的名字:
将单引号更改为 UNLIKELY_STRING 将双引号改为单引号 将 UNLIKELY_STRING 更改为双引号【讨论】:
【参考方案3】:通常,当您想像这样交换 A
和 B
时,您需要一个中间步骤,将 A
替换为完全不同的东西,并且很可能在文档中是唯一的,无论是不寻常的字符还是更长更疯狂的东西,比如|x-monkeyz-x|
。
然后您可以将所有 B 转换为 As,最后将所有 |x-monkeyz-x|
转换为 B。
例如,
-
将所有
'
替换为!X!
将所有"
替换为'
将所有!X!
替换为"
编辑
这样更好:Easiest way to swap occurrences of two strings in Vim?
【讨论】:
【参考方案4】:使用\=
:
:%s/'\([^']*\)'/\='"'.tr(submatch(1), '"', "'").'"'/g
。这假定这两个字符都只用作引号,但您的初始代码也做同样的事情,除了 my 不检查它们是否配对。
【讨论】:
以上是关于单引号中的双引号,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章