Linux 自动更改我的C代码中某些内容的脚本或命令?

Linux 自动更改我的C代码中某些内容的脚本或命令?,linux,shell,awk,Linux,Shell,Awk,我有几个C文件。我创建了一个名为 X_STRING(arg1,arg2,arg3,arg4); 我从不同的C文件中多次调用这个函数。我想替换所有这些函数对X_字符串(arg1,arg2,(arg1)*2,(arg2)*3)的调用 “AWK似乎是解决之道,但我不知道如何治疗所有的病例,因为我应该考虑以下情况: 我调用函数时,在不同的参数之间的代码中插入新行 e、 g 参数包含一个括号: e、 g 有人可以告诉我解决问题的好工具吗?如果您不介意更改输出中的格式,您可能会喜欢m4解决方案。将以下内容

我有几个C文件。我创建了一个名为

X_STRING(arg1,arg2,arg3,arg4);
我从不同的C文件中多次调用这个函数。我想替换所有这些函数对X_字符串(arg1,arg2,(arg1)*2,(arg2)*3)的调用

“AWK似乎是解决之道,但我不知道如何治疗所有的病例,因为我应该考虑以下情况:

  • 我调用函数时,在不同的参数之间的代码中插入新行
  • e、 g

  • 参数包含一个括号:
  • e、 g


    有人可以告诉我解决问题的好工具吗?

    如果您不介意更改输出中的格式,您可能会喜欢m4解决方案。将以下内容放入文件中:

    define( X_STRING, ``X_STRING''( $1, $2, ($1) * 2, ($2) * 3 )) 定义(X_字符串,`X_字符串“”($1,$2,($1)*2,($2)*3)) 然后运行:

    $ m4 def_file file.c $m4 def_file.c 其中file.c是代码,def_file是包含上述内容的文件名。(名称与此无关。)

    如果您的代码格式正确,这应该可以工作。(如果有不匹配的括号,则将失败。)
    这将更改空白,但在其他情况下应该可以执行您想要的操作。

    如果您不介意更改输出中的格式,您可能会对m4解决方案感到满意。将以下内容放入文件中:

    define( X_STRING, ``X_STRING''( $1, $2, ($1) * 2, ($2) * 3 )) 定义(X_字符串,`X_字符串“”($1,$2,($1)*2,($2)*3)) 然后运行:

    $ m4 def_file file.c $m4 def_file.c 其中file.c是代码,def_file是包含上述内容的文件名。(名称与此无关。)

    如果您的代码格式正确,这应该可以工作。(如果有不匹配的括号,则将失败。)
    这将更改空格,但在其他情况下应该可以执行您想要的操作。

    另一个解决方案可能是通过使用C编写的GCC插件或使用C编写的GCC扩展来自定义GCC编译器

    在编译器内部工作的优点是,您可以处理某些编译器的内部表示(如Gimple for GCC),而不仅仅是文本。例如,如果对
    X\u字符串的调用是通过宏的展开或函数的内联来显示的,那么文本方法就不能很好地工作


    扩展GCC编译器也有几个缺点:它是特定于GCC的(甚至可能取决于GCC的版本),需要几天的工作。

    另一个解决方案可能是通过使用C编写的GCC插件或使用C编写的GCC扩展来定制GCC编译器

    在编译器内部工作的优点是,您可以处理某些编译器的内部表示(如Gimple for GCC),而不仅仅是文本。例如,如果对
    X\u字符串的调用是通过宏的展开或函数的内联来显示的,那么文本方法就不能很好地工作


    扩展GCC编译器也有几个缺点:它是特定于GCC的(甚至可能取决于GCC的版本),需要几天的工作。

    您是否只有上述两种方案,或者可能有更多方案?您是否只有上述两种方案,或者可能有更多方案?但我有一个问题,你认为awk也能做到吗?我看不到一个简单的awk解决方案。试着匹配牙套是很困难的。考虑输入:xxx字符串(FO(a,b),1, 2, 3);但我有一个问题,你认为awk也能做到吗?我看不到一个简单的awk解决方案。试着匹配牙套是很困难的。考虑输入:xxx字符串(FO(a,b),1, 2, 3);