【问题标题】:Linux script that counts number of printf parameters for each occurrence计算每次出现的 printf 参数数量的 Linux 脚本
【发布时间】:2012-08-09 15:07:00
【问题描述】:

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

我被卡住了,因为 printf 没有以换行结尾...

例如

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

应该返回

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

【问题讨论】:

  • 在尝试提出解决方案之前,请问您为什么要这样做?如果您想为printf 提供一个包装器,您可以使用可变参数来实现,这样您就不必编写printf1printf2printf3 等。
  • 一般来说,我想实现以下目标——对于 printf 的每个实例,我想消除格式字符串,只剩下参数的数量和参数。例如printf("hello %d %c",hello, char) => printf2(2,hello,char);
  • 你怎么知道参数的类型?你会用printf("%s %d", str, num);做什么?
  • 其实我打算不支持 %s (这个具体用法没问题)
  • 即便如此,printf("%d %c", num, ch); 会打印出类似12 x 的内容,而您无法区分两者。您是否尝试将所有内容打印为int?您更了解此用法的上下文,但我的直觉说,对于您的要求,有更好的解决方案。如果您告诉我们您为什么要这样做,我们可能会为您提供更优雅的解决方案。 ;)

标签: bash shell format printf


【解决方案1】:

对此没有简单(= 在脚本中)的解决方案,因为要解析 C 代码,您需要一个 LL(1) parser

但是您可以以相同的方式格式化所有代码,以便您的脚本可以处理不同的情况。所以你首先应该做的是找到所有带有printf但没有);的行:

grep "printf" ...files... | grep -v ");"

然后修复这些文件,直到不再有任何输出。

【讨论】:

  • 将原文件移动到新的地方,写入新文件。 PS:cutgrep 不是解析器,它们只是输入过滤器。一方面,他们无法回溯和处理递归令牌树。
  • 因为我不知道你看不到什么,所以我无能为力:-)
  • 我看不出如何解决我提出的问题...您提供的答案不切实际,因为它显然会在未来打破 - 我不能假设从现在开始使用我的代码的程序员将使用单行 printf 约定...
  • 创建一个运行检查脚本并确保它不会产生任何输出的测试用例。
【解决方案2】:

作为起点,一个简单的 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 ...

这将替换带引号的字符串、cmets 等;它将捕获 fprintfsprintfmyownsacredprintf 以及普通的 printf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2016-06-02
    相关资源
    最近更新 更多