我修改了一个函数,让我们说
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变量名或其类型的有效常量值。
答案 0 :(得分:2)
由于我们正在使用C代码,因此我们无需担心函数重载问题。
假设简单变量名称和常量被传递到函数调用中,并且代码在函数原型更改之前是可编译的:
使用foo(\([^,]*\),\([^,]*\))
搜索并替换为foo(\1,\2,0)
。
但有几点需要注意:
char
字段不应包含','
。如果确实如此,它将不会被替换。char
字段不应包含)
。 将导致更换不良。foo
结尾的功能。如果存在,替换可能会使代码混乱。使用\(foo([^)]+\)
搜索并替换为\1,0
(感谢glenn jackman)
但有几点需要注意:
int
和char
字段都不应包含)
。 将导致更换不良。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
。)