Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex sed:嵌套模式替换_Regex_Sed_Nested - Fatal编程技术网

Regex sed:嵌套模式替换

Regex sed:嵌套模式替换,regex,sed,nested,Regex,Sed,Nested,我有一堆C代码,其中包括对幂函数的调用: Power(x,2) 我想对它进行扩展,这样所有的幂都可以显式写出,例如,Power(x,2)应该替换为(x)*(x)。 我目前正在使用以下sed命令: sed-e的/Power(\([^,]*\),2)/(\1)*(\1)/g'main.c 这适用于简单的情况,例如Power(x,2)或Power(x+y-3*z,2)。 但是,一旦我对函数进行了嵌套调用,它就不再工作了。我希望它从函数的最里面的实例开始,向外工作。例如,如果输入是 Power(Powe

我有一堆C代码,其中包括对幂函数的调用:

Power(x,2)

我想对它进行扩展,这样所有的幂都可以显式写出,例如,
Power(x,2)
应该替换为
(x)*(x)
。 我目前正在使用以下
sed
命令:

sed-e的/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)

但是使用上面的表达式,它返回

(功率(x)*(功率(x)+x,2)


是否有一种简单而优雅的方法来解决此问题?

基于给定的示例:

$cat ip.txt
功率(功率(x,2)+x,2)
功率(x+y-3*z,2)
功率(x+功率(x,2),2)
$perl-pe'while(s/Power\(((?:(!Power\())+),2\/($1)*($1)/){}ip.txt
((x)*(x)+x)*((x)*(x)+x)
(x+y-3*z)*(x+y-3*z)
(x+(x)*(x))*(x+(x)*(x))
  • while
    只要替换成功,循环就会工作
  • (?:(?!Power\())+?
    只要不是
    Power(
    • 第一次出现
      ,2
    • (?:(?!REGEXP.)+
      是一种只要给定REGEXP不匹配就匹配文本的通用方法,类似于匹配给定集合以外字符的
      [^set]+

sed中有一种方法,只要你不将
电源
用于2以外的电源。(sed不擅长数字。)我不知道我会称之为简单。你介意告诉我方法吗?如果它不简单,只要它能工作,就不会太糟糕。我认为这可以通过告诉sed从输入的右端开始,然后向左移动来解决。这样它会首先击中最里面的电源()有什么方法可以做到这一点吗?
perl-pe'while(s/Power\((((?:(!Power\())+),2\/($1)*($1)/){}'
适用于给定的示例,但我认为并不适用于所有情况。这很好!您想把它作为一个真正的答案来写吗?