交换所有出现的两个字符串

时间:2013-12-23 12:16:06

标签: vim

比如说,我有一个文档,其中所有括号都被翻转:

  

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()

3 个答案:

答案 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