问题 双引号用单引号,反之亦然


我经常发现自己反转引号:
来自双引号 "" 单引号 '' 和
来自单引号 '' 双引号 ""

我知道有一种方法可以将单引号切换为双引号:
:%s/'\(\([^']*\)\)'/"\1"/g

以及将双引号切换为单引号的方法:
:%s/"\(\([^"]*\)\)"/'\1'/g 

但我该怎么做两个操作 一起 不包括第二次交换中的第一个交换引号?


13111
2018-04-12 18:36


起源

在一个命令中使用哈希映射替换多个单词:%s / \ <\%(foo \ | bar \ | baz)\> / \ = {'foo':'bar','bar':'baz' ,'baz':'foo'} [submatch(0)] / gc ..这里foo - > bar,bar - > baz,baz - > foo。 - mosh


答案:


如果字符串文字中没有转义引号,则不需要 确保正确配对引号,可以使用该命令

:%s/['"]/\="'\""[submatch(0)!='"']/g

3
2018-04-13 08:04



`@ib,对于转义引号你是什么意思?你的正则表达式也适用于你自己的正则表达式(带有转义引号?) - 顺便说一句tnx :) - Reman
@Remonn:我的意思是在你操作的文本中引用转义语法。如果你在Vim-script字符串文字上运行这些替换,那么 "one\"two" 将改为 'one\'two' 它不代表与原始文字相同的字符串。 - ib.


通常,当你想要交换 A & B 像这样,你需要一个中间步骤来替换 A 具有完全不同的东西,很可能在文档中是独一无二的,无论是一个不寻常的角色还是更长,更疯狂的东西 |x-monkeyz-x|

然后,您可以将所有B转换为As,最后转换为所有 |x-monkeyz-x| 对Bs。

例如,

  1. 全部替换 ' 同 !X!
  2. 全部替换 " 同 '
  3. 全部替换 !X! 同 "

编辑

这个更好: 在Vim中交换两个字符串的最简单方法?


5
2018-04-12 18:58





使用 \=

:%s/'\([^']*\)'/\='"'.tr(submatch(1), '"', "'").'"'/g

。这假定两个字符仅用作引号,但您的初始代码也是相同的,除了我没有检查它们是否配对。


2
2018-04-12 18:56





我通常使用像我名字这样的中间字符串,它不太可能出现在文本中:

  • 将单引号更改为UNLIKELY_STRING
  • 将双引号更改为单引号
  • 将UNLIKELY_STRING更改为双引号

2
2018-04-12 18:59