替换括号

len*_*nho 4 regex vim awk sed

我想在下面用"Exp [...]"替换所有出现的"exp(...)"(基本上从Matlab改为Mathematica语法):

exp(-(pi*k2*2i)/3)*(v9/4 + (3^(1/2)*(v8/2 + (3^(1/2)*v9)/2))/2 + (3^(1/2)*v8)/12) + exp((pi*k2*2i)/3)*(v9/4 + (3^(1/2)*(v8/2 + (3^(1/2)*v9)/2))/2 + (3^(1/2)*v8)/12) ...
Run Code Online (Sandbox Code Playgroud)

是否可以使用vim,sed或awk自动执行此操作?诀窍不是将所有"("替换为"[",只替换在exp之后立即出现的那些和相应的对.

Sib*_*der 9

你可以用vim宏来做到这一点.

让我们a按下清除寄存器qaq.(如果记录了以前的任何操作,我们可以清除它们)

按下开始宏录制qa.exp(通过输入搜索/exp(/e.这会把光标放在(.按下%移动到其右括号.按下r]以替换它].现在,按N移动到exp(.按下r[以替换它[.按@a以递归替换所有此类实例.按q停止录制.

现在,你可以按下@a播放宏,它将取代所有地方.

  • 如果你想使用一点点自动化,你可以输入`:%s/exp(// gn`来计算你的代码中出现`exp(...)`的次数.说它是`n`然后输入`n @ a`来运行宏`n`次并立即进行所有更改. (3认同)
  • +1正确使用递归宏.虽然您可能希望在开始录制之前清除"a"寄存器.先运行`qaq`. (3认同)