Linux 自动更改我的C代码中某些内容的脚本或命令?
我有几个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解决方案。将以下内容
X_STRING(arg1,arg2,arg3,arg4);
我从不同的C文件中多次调用这个函数。我想替换所有这些函数对X_字符串(arg1,arg2,(arg1)*2,(arg2)*3)的调用
“AWK似乎是解决之道,但我不知道如何治疗所有的病例,因为我应该考虑以下情况:
有人可以告诉我解决问题的好工具吗?如果您不介意更改输出中的格式,您可能会喜欢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);