我想使用vim的查找和替换功能将所有的双引号 " 替换为单引号 ',反之亦然。有没有一步完成的方法?我在考虑这样做:
:s/\("\|'\)/\1=="?':"/
当然,\1=="?':"
部分是在 vim 中有效的。
提前感谢!
这是一个需要使用:help sub-replace-special
的情况:
:s/["']/\=submatch(0) == '"' ? "'" : '"'/g
这会匹配任意两个引号(也可以用[...]
做简化),然后使用三元运算符将每个引号转换为其相反的形式。(对于更复杂的情况,您可以使用字典查找。)
另一种适用于脚本编写的方法是使用内置的tr()
函数。要在缓冲区上应用它,需要使用getline()
/setline()
:
:call setline('.', tr(getline('.'), "'\"", "\"'"))
Unix工具的威力 ;)
:%!tr "'\"" "\"'"
:Subvert
命令,它为您提供了一种不同的搜索和替换方法,具有自己的小型DSL。:%S/{\",'}/{',\"}/g
\"
是怎么回事?这非常不直观!(如果我把它移除,会得到一个E64
错误)。 - Ingo Karkat可能是最懒/最简单的方法:
:%s/'/__/g | %s/"/'/g | %s/__/"/g
将三个基本步骤合并为一行:
'
转换为 __
(或其他随机字符)"
转换为 '
__
转换为 "
然后使用 |
符号将它们组合起来。
我相信一些 vim 高手会有更好的解决方案,但这对我很有效。
\1
、\2
等能在替换表达式中使用吗?我尝试过,但反斜杠会被字面插入。 - Enlicosubmatch(1)
等方式实现;在这里字面上的\1
不起作用。 - Ingo Karkat11
、21
、31
替换m1
、m2
、m3
等,用12
、22
、32
替换p1
、p2
、p3
等。我会使用:s/\([mp]\)\(.\)/\=submatch(1) == 'm' ? '???' : '???'
,但我不知道这两个替换字符串(???
)应该是什么。 - Enlico:s/\([mp]\)\(.\)/\=submatch(2) . (submatch(1) == 'm' ? '1' : '2')/g
- Ingo Karkatsubmatch
。 - Enlico