【发布时间】:2021-07-16 17:26:39
【问题描述】:
我有一堆 C 代码,涉及到以下形式的幂函数调用:
Power(x,2)
我想扩展它,以便明确写出所有权力,例如Power(x,2) 应替换为(x)*(x)。
我目前正在使用以下sed 命令:
sed -e 's/Power(\([^,]*\),2)/(\1)*(\1)/g' main.c
这适用于Power(x,2) 或Power(x+y-3*z,2) 等简单情况。
但是,一旦我对函数进行了嵌套调用,它就不再起作用了。我希望它从函数的最里面的实例开始并向外工作。例如,如果输入是
Power(Power(x,2) + x,2)
预期的输出是
((x)*(x) + x)*((x)*(x) + x)
但是使用上面的表达式,它会返回
(Power(x)*(Power(x) + x,2)
有没有简单优雅的方法来解决这个问题?
【问题讨论】:
-
sed中有一种方法,前提是您不要将Power用于 2 以外的幂。(sed 不适用于数字。)我不知道我会打电话很简单。 -
你介意告诉我路吗?如果它不简单,那也不算太糟糕,只要它有效。
-
我认为这可以通过告诉 sed 从输入的右端开始并向左工作来解决。这样,它将首先击中最里面的 Power() 并打开它,然后才击中外面的那个。有没有办法做到这一点?
-
perl -pe 'while(s/Power\(((?:(?!Power\().)+?),2\)/($1)*($1)/){}'适用于您给定的样本,但我认为不适用于所有情况。