我从 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(\([^,]*\), *\([^)]*\))
.这意味着 matchComplex(
,然后最长的连续非,
字符 ([^,]*
) 字符串被捕获为 \1,然后是单个逗号和零个或多个空格,然后是最长的非)
字符字符串,直到找到右括号。整个事情被替换为(\1 + i*\2)
.匹配的正则表达式
Power()
本质上是一样的。
答案2
您可以使用sed
的字符串替换功能:
sed -i 's/"complex(a, b)"/(a + i*b)/g'
对于其他模式也是如此,只需替换complex(a,b)
为您要替换的表达式以及(a + i*b)
您想要的字符串而不是该表达式。