sed 将代码从 Mathematica 转换为 Matlab 的挑战

sed 将代码从 Mathematica 转换为 Matlab 的挑战

我从 Mathematica 到 C 代码的输出如下:

$ cat file.txt
Complex(1.3, 2.7)*Power(kappa, 2.0) + Complex(0.3, 2.0)*Power(kappa,5.0)*log(alpha)

该文件非常长(数万行)。我想将每个 Complex(a, b) 替换为 (a + i*b) 并将每个 Power(a, b) 替换为 a^b。所以上面的示例看起来像:

$ cat desired_file.txt
(1.3 + i*2.7)*kappa^2.0 + (0.3 + i*2.0)*kappa^5.0*log(alpha)

我怎样才能使用 sed 来达到这个结果?通过阅读正则表达式和示例根本不是直截了当的。

我该如何使用 来做到这一点sed

答案1

这应该可以做到:

sed 's/Complex(\([^,]*\), *\([^)]*\))/(\1 + i*\2)/g; 
     s/Power(\([^,]*\), *\([^)]*\))/\1^\2/g' file

这不适用于嵌套语句喜欢Power(Power(a, b), c)

解释

  • 要替换 中的模式sed,请使用替换运算符 ( s/pattern/replacement/)。g最后的意思是全球的,它会导致替换应用于所有匹配。

  • 图案可以是被捕获稍后通过将它们放在转义括号内来重用:\(\)。第一个这样的模式是\1,第二个\2等等。

  • 为了替换Complex(a, b),我使用Complex(\([^,]*\), *\([^)]*\)).这意味着 match Complex(,然后最长的连续非,字符 ( [^,]*) 字符串被捕获为 \1,然后是单个逗号和零个或多个空格,然后是最长的非)字符字符串,直到找到右括号。整个事情被替换为(\1 + i*\2).

  • 匹配的正则表达式Power()本质上是一样的。

答案2

您可以使用sed的字符串替换功能:

sed -i 's/"complex(a, b)"/(a + i*b)/g'

对于其他模式也是如此,只需替换complex(a,b)为您要替换的表达式以及(a + i*b)您想要的字符串而不是该表达式。

相关内容