替换括号

时间:2016-06-25 04:23:27

标签: 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) ...

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

3 个答案:

答案 0 :(得分:9)

您可以使用10e32宏执行此操作。

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> </style> </head> <body> <script> var context = new AudioContext(); function loadSound(url) { var request = new XMLHttpRequest(); request.open("GET", url, true); request.responseType = "arraybuffer"; request.onload = function() { data = new Uint8Array(request.response); var buffer = context.createBuffer(1, data.length, 24000); var channelData = buffer.getChannelData(0); for (var i = 0; i < data.length; i++) { channelData[i] = data[i]; } var source = context.createBufferSource(); source.buffer = buffer; source.connect(context.destination); source.start(0); } request.send(); } loadSound('./test.wav'); </script> </body> </html> 清除vim注册表。 (如果记录了任何先前的操作,我们可以清除它们)

a启动宏录制。 键入qaq搜索qa。这会将光标置于exp(。 按/exp(/e移至关闭括号。按(将其替换为%。 现在,按r]移至]。按N将其替换为exp(。按r[以递归方式替换所有此类实例。按[停止录制。

现在,您可以按@a播放宏,它将在任何地方替换。

答案 1 :(得分:0)

在下面的sed脚本(brackreplace)中,我们是:

  • exp(Exp§
  • 隐藏平衡(...)«...»(如果内部没有"()§"
  • Exp§...)Exp[...]
  • 恢复隐性肠外炎
#!/bin/sed -zf 

s/exp(/Exp§/g                    # (1) protect        exp( →  Exp§
s/(\([^()§]*\))/«\1»/g           # (2) hide balanced  (...) → «...» 

s/Exp§\([^()§]*\))/Exp[\1]/g     # (3) Exp§...) → Exp[...]
s/«/(/g                          # restore protected parentesis
s/»/)/g 

这涵盖了你的榜样;如果你期望exp(...)中有更深的(),请重复第(2)行。

chmod之后,可以在命令行或编辑器内使用此命令。 vim示例:

:%!bracketreplace

答案 2 :(得分:0)

就像Sibi的答案一样,但只是一个微妙的变化,你应该使用``跳回到匹配的括号而不是N。否则它不适用于这种模式:exp(...exp(...))