vim 单引号中的双引号,反之亦然

6l7fqoea  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(108)

我经常发现自己颠倒了报价:

**从双引号""到单引号''**和
从单引号''到双引号""

我知道有一种方法可以将单引号转换为双引号:
:%s/'\(\([^']*\)\)'/"\1"/g
还有一种将双引号转换为单引号的方法:
:%s/"\(\([^"]*\)\)"/'\1'/g
但是我如何在第二次交换中不包括第一次交换的引号的情况下同时进行这两个操作呢?

nwsw7zdq

nwsw7zdq1#

通常,当你想像这样交换AB时,你需要一个中间步骤,用完全不同的东西替换A,并且很可能在文档中是唯一的,无论是不寻常的字符还是更长更疯狂的东西,比如|x-monkeyz-x|
然后,您可以将所有的Bs转换为As,最后将所有的|x-monkeyz-x|转换为Bs。
比如说,
1.将所有'替换为!X!
1.将所有"替换为'
1.将所有!X!替换为"

编辑

更好的:Easiest way to swap occurrences of two strings in Vim?

ejk8hzay

ejk8hzay2#

如果字符串字面量中没有转义引号,并且不需要它来确保正确的引号配对,则可以使用命令

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

字符串

ve7v8dk2

ve7v8dk23#

我通常使用一个中间字符串,比如我的名字,它不太可能出现在文本中:

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

bkhjykvo4#

使用\=

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

字符串
这假设两个字符都只作为引号,但是初始代码也是这样做的,只是my不检查它们是否配对。

7cjasjjr

7cjasjjr5#

就像这里有人说的:

:%s/"/*/g | %s/'/"/g | %s/*/'/g

字符串
这可以分别通过三个命令来完成。也可以通过两个命令来完成:

:%s/'\|\("\)/"\1/g | %s/""/'/g

相关问题