Linux脚本,用于计算每次出现的printf参数数

时间:2012-08-09 15:07:00

标签: bash shell format printf

我想在sh中编写一个脚本,对于每个给定的文件,对于每个printf事件,它将计算%的数量(或者printf函数接收的参数数量),并将printf重命名为printfX,当X是那个数字时。

我被卡住了因为printf没有以新线结束......

e.g。

printf("hello "
       "world %d\n", 1);

应该返回

printf1("hello "
       "world %d\n", 1);

2 个答案:

答案 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 ...

这将取代引用的字符串,注释等;它会捕获fprintfsprintf以及myownsacredprintf以及普通printf