使用“sed”编辑代码的问题

使用“sed”编辑代码的问题
for(int i=0; i<oldmethod(a, 7); i++) {
  sum += oldmethod(b*b+i-3, i%a);

---->

 for(int i=0; i<newmethod(7, 0, a); i++) {
  sum += newmethod(i%a, 0, b*b+i-3);

我有

sed 's/old(\([-a-zA-Z 0-9./*+]*\),\([-a-zA-Z 0-9./*+]*\))/new(\2, 0, \1)/'

但它只改变了第一个旧方法,比如

 for(int i=0; i<newmethod(7, 0, a); i++) {
   sum += oldmethod(b*b+i-3, i%a);

答案1

第二行中的参数之一是i%a。这不会与您的正则表达式匹配,因为您尚未包含%在您的字符类中[-a-zA-Z 0-9./*+]。尝试

sed 's/oldmethod(\([-a-zA-Z 0-9./*+%]*\),\([-a-zA-Z 0-9./*+%]*\))/newmethod(\2, 0, \1)/'

您可能会发现使用您未考虑过的其他字符的更多实例,例如_在变量名称中或()其他函数的嵌套调用中。当遇到此类用途时,您必须不断扩展子表达式。

答案2

更通用的可能性:

sed -E 's/old([^,]*\()([^,])*, ([^)]*)\);/new\1\3, 0, \2);/' file

输出:

for(int i=0; i<newmethod(7, 0, a); i++) {
  sum += newmethod(i%a, 0, b*b+i-3);

相关内容