比如说,我有一个文档,其中所有括号都被翻转:
Lorem)ipsum(dolor)坐着(amet
我想纠正它:
Lorem(ipsum)dolor(sit)amet
当然我不能用两个替换进行交换;首先将所有(
替换为)
,然后将所有)
替换为(
,因为这样我最终会得到:
Lorem(ipsum(dolor(sit(amet)
请提供一种方法,在vim中为任何一对字符串执行此操作。
更新
感谢 ernix 提供了一个很好的答案。对于那些想知道tr
函数的作用的人:
http://vimdoc.sourceforge.net/htmldoc/eval.html#tr()
答案 0 :(得分:5)
使用vimscript:
:%call setline(".", tr(getline("."), "()", ")("))
或只是致电tr
:
:%!tr ')(' '()'
如果你考虑白色空间,那么肯特的答案是最好的:)
%s/\(\s*\((\|)\)\s*\)/\=substitute(submatch(0),submatch(0),submatch(2)=='('?') ':' (', 'g')/g
答案 1 :(得分:3)
这一行将会这样做:
:s/[()]/\=substitute(submatch(0),submatch(0),submatch(0)==')'?'(':')','g')/g
它看起来很长,因为函数名submatch(
,您可以编写一个小函数或将匹配部分分配给var。
来自 ernix 的好主意:
s/[()]/\=tr(submatch(0),')(','()')/g
答案 2 :(得分:1)
一个简单的方法:
%s/(/1UnIqUe1/g
%s/)/(/g
%s/1UnIqUe1/)/g