在vim中进行条件替换

10

我想使用vim的查找和替换功能将所有的双引号 " 替换为单引号 ',反之亦然。有没有一步完成的方法?我在考虑这样做:

:s/\("\|'\)/\1=="?':"/

当然,\1=="?':" 部分是在 vim 中有效的。

提前感谢!

5个回答

18

这是一个需要使用:help sub-replace-special的情况:

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

这会匹配任意两个引号(也可以用[...]做简化),然后使用三元运算符将每个引号转换为其相反的形式。(对于更复杂的情况,您可以使用字典查找。)


匹配的模式\1\2等能在替换表达式中使用吗?我尝试过,但反斜杠会被字面插入。 - Enlico
1
@EnricoMariaDeAngelis:是的,可以通过submatch(1)等方式实现;在这里字面上的\1不起作用。 - Ingo Karkat
假设我想用 112131 替换 m1m2m3 等,用 122232 替换 p1p2p3 等。我会使用 :s/\([mp]\)\(.\)/\=submatch(1) == 'm' ? '???' : '???',但我不知道这两个替换字符串(???)应该是什么。 - Enlico
2
@EnricoMariaDeAngelis::s/\([mp]\)\(.\)/\=submatch(2) . (submatch(1) == 'm' ? '1' : '2')/g - Ingo Karkat
正是我所需要的!我的错误在于尝试在“= ? :”结构的引号中使用submatch - Enlico

3

另一种适用于脚本编写的方法是使用内置的tr()函数。要在缓冲区上应用它,需要使用getline()/setline()

:call setline('.', tr(getline('.'), "'\"", "\"'"))

3

Unix工具的威力 ;)

:%!tr "'\"" "\"'"

(将双引号和单引号互换)

2
你可以使用abolish.vim插件轻松实现此操作。 Abolish.vim具有一个:Subvert命令,它为您提供了一种不同的搜索和替换方法,具有自己的小型DSL。
:%S/{\",'}/{',\"}/g

此插件荣膺Vimcasts.org特别荣誉,并推出了三个屏幕录制视频来介绍它:第一部分第二部分第三部分

转义\"是怎么回事?这非常不直观!(如果我把它移除,会得到一个E64错误)。 - Ingo Karkat

0

可能是最懒/最简单的方法:

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

将三个基本步骤合并为一行:

  1. ' 转换为 __ (或其他随机字符)
  2. " 转换为 '
  3. __ 转换为 "

然后使用 | 符号将它们组合起来。

我相信一些 vim 高手会有更好的解决方案,但这对我很有效。


我考虑过这个问题,我肯定可以做到,但vim非常强大,我只是好奇,是否有一步解决此问题的方法;-) - Vince
Vim非常强大。我相信人们会有更简单的东西。 - jahroy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接