Vim 如何将括号替换为括号,但将内容保留在括号之间?

Vim 如何将括号替换为括号,但将内容保留在括号之间?,vim,Vim,我在vim中有以下字符串: if [ a == 100 ] 我想将其更改为: if (( a==100 )) 我想用括号代替括号,保持内容不变, 我尝试: 我得到: if (( .* )) 我怎样才能得到原始内容? 提前谢谢你们 您可以使用: %s/if \[\(.*\)\]/if ((\1))/ 这使用反向引用,即捕获元括号之间的内容,并根据捕获顺序使用\来投影捕获的内容 你并不真的需要g标志,因为shell脚本不太可能在同一行上有多个if。不是要反驳Rafael的答案,而是作为另一个

我在vim中有以下字符串:

if [ a == 100 ]
我想将其更改为:

if (( a==100 ))
我想用括号代替括号,保持内容不变, 我尝试:

我得到:

if (( .* ))
我怎样才能得到原始内容? 提前谢谢你们

您可以使用:

%s/if \[\(.*\)\]/if ((\1))/
这使用反向引用,即捕获元括号之间的内容,并根据捕获顺序使用\来投影捕获的内容


你并不真的需要g标志,因为shell脚本不太可能在同一行上有多个if。

不是要反驳Rafael的答案,而是作为另一个可能更通用的解决方案来处理周围的角色对:这就是Tim Pope的精彩插件的用途

将光标放在方括号上或方括号内 cs]将周围的方括号]更改为括号 vi目视选择内圆括号 S用括号环绕视觉选择 步骤2将您的输入更改为:

if ( a == 100 )
在第4步之后,它看起来是这样的:

if (( a == 100 ))
编辑:快捷方式@voger


第3步和第4步可以结合到更快的ysa中。

这里提供了一个解决方案,用于更容易阅读的情况,您不仅需要在某些行中执行更改,而且还需要在许多行中执行手动操作变得枯燥乏味的更改

使用宏:

let @a="f[r(f]r)"

f[ ................ jump to the [
r( ................ replace with (
f] ................ jump to ]
r) ................ replace with )
跳转到需要更改的行并键入@a

使用全局命令:

:g/if \[/normal f[r(f]r)
:g/if \[/normal @a
基本上,我们在宏和全局命令中使用相同的命令。
请注意,second global使用了上面定义的“a”宏。

sed's/\[a==100\]/test$a-eq 100/这是一个非常酷的插件!您发现自己在开发过程中经常使用它吗?我想补充一点,即不需要进行可视化选择。将光标放在括号内,然后进行ysa,你会得到相同的结果。@Rafael:是的,它可能是最重要的开发插件中的前5个。
:g/if \[/normal f[r(f]r)
:g/if \[/normal @a