我TRIAL_FUNC(a, b, c)
在多个 C 文件中多次调用了该函数。
我需要在多个 C 文件中找到此函数的每个出现位置并将其替换为trial_func(a, b, c, b)
,并添加其值为的第 4 个参数b
。
文件中对该函数的所有调用中,参数并不相同。例如:TRIAL_FUNC(x, sizeof(y), z)
,TRIAL_FUNC(sizeof(d), 45, e)
。可以看出,参数没有相同的模式。
假设文件保存在同一个目录中,有人可以帮我编写一个 shell 脚本(bash)来完成这个任务吗?
答案1
sed -i 's/TRIAL_FUNC\(([0-9]+), ([0-9]+), ([0-9]+)\)/trial_func\(\1, \2, \3, \2\)/' *.c
sed
是一个流编辑器-i
表示“就地”编辑 - 即它将直接修改文件(先备份!)s/
表示“替换”,s/x/y/
将所有 x 替换为 y- 其余的是正则表达式:
\(
用于匹配文字,(
因为它是一个特殊的正则表达式字符([0-9]+)
用于匹配数字并将其匹配项保存为“组”\1
、\2
和\3
用于访问匹配的“组”
答案2
首先,注意danzel 的评论:
您确实应该使用带有重构工具的 IDE。基于正则表达式的替换取决于您的特定代码格式,并且很容易中断。
话虽如此,你可以使用以下正则表达式替换sed
:
sed -i.bak 's/TRIAL_FUNC(\(.*\), \(.*\), \(.*\))/trial_func\(\1, \2, \3, \2\)/' *.c
解释:
-i.bak
- “就地”编辑文件,即保存更改,但首先使用 .bak 扩展名进行备份s/x/y/
- 替换x
为y
\(\)
- 这是一个比赛小组.*
- 零个或多个字符\1
- 插入第一个匹配组*.c
- 当前目录中的所有 .c 文件
例子:
这是您提到的代码:
TRIAL_FUNC(a, b, c) TRIAL_FUNC(x, sizeof(y), z) TRIAL_FUNC(sizeof(d), 45, e)
输出:
trial_func(a, b, c, b) trial_func(x, sizeof(y), z, sizeof(y)) trial_func(sizeof(d), 45, e, 45)
这是不兼容的代码:
TRIAL_FUNC( foo, bar, baz, ) TRIAL_FUNC(a,b,c) other_func(TRIAL_FUNC(a, b, c), TRIAL_FUNC(a, b, c))
输出:
TRIAL_FUNC( foo, bar, baz, ) TRIAL_FUNC(a,b,c) other_func(trial_func(a, b, c), TRIAL_FUNC(a, b, c), b)
您可以编写一个正则表达式来解释这些问题,但这不值得付出努力。
这部分基于Kristopher 的回答,部分内容涉及我上一个回答,现已被删除。