查找和替换函数名称并编辑其参数

查找和替换函数名称并编辑其参数

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/- 替换xy
  • \(\)- 这是一个比赛小组
  • .*- 零个或多个字符
  • \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 的回答,部分内容涉及我上一个回答,现已被删除。

相关内容