Vim 交换两个字符串的所有匹配项
例如,我有一个所有括号对都翻转的文档: Lorem)ipsum(dolor)sit(amet 我想纠正一下: Lorem(ipsum)dolor(sit)amet 当然,我不能用两个替换来进行交换;首先用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
请为任何一对字符串提供在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