Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 交换两个字符串的所有匹配项_Vim - Fatal编程技术网

Vim 交换两个字符串的所有匹配项

Vim 交换两个字符串的所有匹配项,vim,Vim,例如,我有一个所有括号对都翻转的文档: Lorem)ipsum(dolor)sit(amet 我想纠正一下: Lorem(ipsum)dolor(sit)amet 当然,我不能用两个替换来进行交换;首先用(替换所有),然后用()替换所有),因为这样我将得到: Lorem(ipsum)dolor(sit)amet 请为任何一对字符串提供在vim中执行此操作的方法 更新: 感谢ernix提供了一个好的答案。对于那些想知道tr函数的功能的人: 一个简单的方法: %s/(/1UnIqUe1/g %s/)

例如,我有一个所有括号对都翻转的文档:

Lorem)ipsum(dolor)sit(amet

我想纠正一下:

Lorem(ipsum)dolor(sit)amet

当然,我不能用两个替换来进行交换;首先用
替换所有
,然后用
)替换所有
,因为这样我将得到:

Lorem(ipsum)dolor(sit)amet

请为任何一对字符串提供在vim中执行此操作的方法

更新:
感谢ernix提供了一个好的答案。对于那些想知道
tr
函数的功能的人:
一个简单的方法:

%s/(/1UnIqUe1/g
%s/)/(/g
%s/1UnIqUe1/)/g
这一行可以做到:

:s/[()]/\=substitute(submatch(0),submatch(0),submatch(0)==')'?'(':')','g')/g
它看起来很长,因为函数名
子匹配(
),您可以编写一个小函数或将匹配部分分配给变量

来自ernix的好主意:

s/[()]/\=tr(submatch(0),')(','()')/g
使用vimscript:

:%call setline(".", tr(getline("."), "()", ")("))
或者只需调用
tr

:%!tr ')(' '()'
使现代化

如果考虑白空间,那么<强>肯特<强>的答案是最好的:


是的,我希望有更优雅的东西…:)更重要的是,我想要更健壮的东西。如果我碰巧在文本中的某个地方有“唯一”字符串,这就行不通了。
%s/\(\s*\((\|)\)\s*\)/\=substitute(submatch(0),submatch(0),submatch(2)=='('?') ':' (', 'g')/g