shell脚本用另一个调用替换所有函数调用

时间:2014-02-05 11:51:50

标签: regex shell replace grep

我修改了一个函数,让我们说

foo(int a, char b);加入foo(int a, char b, float new_var);

从现有源代码中的许多地方调用旧函数foo,我想用脚本替换foo(some_a, some_b);的所有出现foo(some_a, some_b, 0);(手动编辑是劳动)。

我尝试对grep 's/old/new/g' file做同样的事情,但问题在于使用正则表达式来匹配参数,并将其插入到替换文本中。

PS:a& b是有效的C变量名或其类型的有效常量值。

2 个答案:

答案 0 :(得分:2)

由于我们正在使用C代码,因此我们无需担心函数重载问题。

假设简单变量名称常量被传递到函数调用中,并且代码在函数原型更改之前是可编译的:

  1. 使用foo(\([^,]*\),\([^,]*\))搜索并替换为foo(\1,\2,0)

    但有几点需要注意:

    • char字段不应包含','。如果确实如此,它将不会被替换。
    • char字段不应包含)导致更换不良。
    • 没有名称以foo结尾的功能。如果存在,替换可能会使代码混乱。
  2. 使用\(foo([^)]+\)搜索并替换为\1,0(感谢glenn jackman

    但有几点需要注意:

    • intchar字段都不应包含)导致更换不良。
    • 没有名称以foo结尾的功能。同样,替换可能会使代码混乱。

答案 1 :(得分:1)

这应该成功:

sed -i.bak -r "s/foo\(\s*([0-9]*)\s*,\s*(([0-Z]|'[0-Z]'))\s*\)/foo(\1, \2, 0)/g" file

请注意,-i.bak代表“替换就位”并在file.bak中创建原始文件的备份。

  • foo\(\s*([0-9]*)\s*,\s*(([0-Z]|'[0-Z]'))\s*\)查找foo( + spaces + digits + spaces + , + spaces + [{ {1}}或'character'] + character + spaces。并替换为) + foo( + digits + , + character + 0

实施例

)