我想在sh中编写一个脚本,对于每个给定的文件,对于每个printf事件,它将计算%的数量(或者printf函数接收的参数数量),并将printf重命名为printfX,当X是那个数字时。
我被卡住了因为printf没有以新线结束......
e.g。
printf("hello "
"world %d\n", 1);
应该返回
printf1("hello "
"world %d\n", 1);
答案 0 :(得分:1)
没有简单的(=在脚本中)解决方案,因为要解析C代码,您需要LL(1) parser。
但是您可以以相同的方式格式化所有代码,以便您的脚本可以处理不同的情况。所以你应该首先找到printf
但没有);
的所有行:
grep "printf" ...files... | grep -v ");"
然后修复这些文件,直到您不再获得任何输出为止。
答案 1 :(得分:0)
作为一个起点,一个简单的Perl脚本用于计算逗号或结束语之前双引号中的%字符数。
perl -0777pe 's/printf\s*\(\s*\"((?:[^"]*\"\s*\")*[^"]*)\"\s*([,)]\s*)/
my ($f, $c, $t) = ($1, $1, $2);
sprintf("printf%i(\"%s\"%s", ($c =~ tr-%--), $f, $t) /ges' files ...
这将取代引用的字符串,注释等;它会捕获fprintf
和sprintf
以及myownsacredprintf
以及普通printf
。