如何用括号替换括号,但保持括号之间的内容?

时间:2019-01-25 03:39:41

标签: vim

我在vim中有以下字符串:

if [ a == 100 ]

我想将其更改为:

if (( a==100 ))

我想用括号替换括号,并保持内容原样, 我尝试:

:%s/if \[ .* \]/if (( .* ))/g

然后我得到了

if (( .* ))

如何获取原始内容? 预先谢谢你们。 :)

3 个答案:

答案 0 :(得分:4)

不是要反驳Rafael的回答,而是作为处理周围字符对的另一种也许更通用的解决方案:这就是Tim Pope出色的vim-surround插件的用途。

  1. 将光标放在方括号上或内部
  2. cs]) C s 将方括号(] )括在括号()中
  3. vi) V 通常选择 i 左括号(
  4. S) S 带括号()的视觉选择

第2步将您的输入更改为此:

if ( a == 100 )

在第4步之后,它看起来像这样:

if (( a == 100 ))

编辑:@voger的快捷方式

第3步和第4步可以合并为更快的 ysa))

答案 1 :(得分:3)

您可以使用:

%s/if \[\(.*\)\]/if ((\1))/

这使用反向引用,即捕获元括号之间的内容,并根据捕获顺序使用\<number>投射捕获的内容。

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

答案 2 :(得分:0)

这是一种解决方案(易于阅读),在这种情况下,您不仅必须在某些行中执行更改,而且还需要在数十行中使手动操作变得无聊。

使用宏:

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

基本上,我们在宏和全局命令中都使用相同的命令。 请注意,第二个全局变量使用上面定义的'a'宏。