我想在 sh 中编写一个脚本,对于每个给定的文件,对于每个 printf 出现,它将计算 % 的数量(或者 printf 函数接收的参数数量)并将 printf 重命名为 printfX,当 X 是那个号码。
我被卡住了,因为 printf 没有以新行结尾......
例如
printf("hello "
"world %d\n", 1);
应该返回
printf1("hello "
"world %d\n", 1);
对此没有简单的(= 脚本中的)解决方案,因为要解析 C 代码,您需要一个LL(1) 解析器。
但是您可以以相同的方式格式化所有代码,以便您的脚本可以处理不同的情况。所以你首先应该做的是找到所有有printf
但没有的行);
:
grep "printf" ...files... | grep -v ");"
然后修复这些文件,直到您不再获得任何输出。
作为起点,一个简单的 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
andsprintf
和myownsacredprintf
as well as plain printf
。