有没有一种快速简便的方法来注释掉多行打印语句?像这样的东西?
printf("3387 strings_line_tokens[lower_bound_of_big_boy_counter] %s \n",
strings_line_tokens[lower_bound_of_big_boy_counter]);
我主要有三种,还有零星的第四种。
printf("3402 checking return stuff \n");
printf("3408 strings_line_tokens[lower_bound_of_big_boy_counter] %s \n",
strings_line_tokens[lower_bound_of_big_boy_counter]);
printf("3410 function_type_for_proper_return %s \n", function_type_for_proper_return);
这是我零星的第四个。有时,这%c
对于找出 if 语句或 while 循环未按预期运行的原因很有用。
printf("2340 symbol_table_variables[i][1] is %s.\n", symbol_table_variables[i][1]);
printf("2341 symbol_table_variables[i][2] is %c.\n", symbol_table_variables[i][2][0]);
请再复杂一点:)。是否可以单独保留这两种类型的打印语句?
printf("2434 REJECT\n");
printf("2534 ACCEPT\n");
答案1
说“处理以下成员”是没有意义的这以一种方式分组,并处理 这另一组换一种方式。”您应该指定一个组以一种方式处理,并规定其他所有内容都以另一种方式处理。所以我假设你想要全部 printf
注释掉的语句除外,类似于以下之一的语句:
printf("2434 REJECT\n");
printf("2534 ACCEPT\n");
因此,这里有一个“简单”的解决方案:
awk '
/printf/ { comment=1 }
/printf\("[0-9]* REJECT/ { comment=0 }
/printf\("[0-9]* ACCEPT/ { comment=0 }
{ if (comment) printf "//"
print }
/;/ { comment=0 }
'
它的作用如下:
- 每当它看到包含 的行时
printf
,它就会设置comment
标志。 (请注意,这将匹配对fprintf
和 的调用sprintf
调用。它还将匹配评论和字符串包含这个词printf
;例如,/* 这个 printf 用于弄清楚 if 语句正在做什么。 */
如果您需要更具体,请调整它。) - 然后,如果发现它是
printf
一串数字,后面跟一个空格,后面跟REJECT
或ACCEPT
,那么它就变成离开这comment
,因为您不希望这些语句被注释掉。请注意,这些正则表达式有点宽泛——它们会接受任何数字数字(不仅仅是四个),并且它们不检查该单词是否是该行的最后一个。如果您需要更具体,请调整它们。 - 然后它为每一行输入执行一个两行代码块:
- 如果
comment
设置了该标志,则会写出//
, 以注释掉该行。请注意awk
,与 C 中一样, inprintf
不会自动写入换行符。 - 然后,对于每一行,它都会写入该行。 (在
awk
里面print
声明做自动在末尾写入换行符;默认是将输入行写入输出。)因此,这会将输入行写入输出,并用//
if it is (part of) aprintf
statements(而不是特殊情况之一)进行注释。
- 如果
- 然后,如果它看到一个分号,它就会关闭该
comment
标志。这允许在处理comment
多行语句时标志保持设置状态。printf
这就是为什么字符串printf
中不包含分号很重要,因为该awk
脚本会将分号误认为是语句的结尾。
例如,对于输入
cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
strings_line_tokens[lower_bound_of_big_boy_counter]);
if (cmp_str9 == 0)
{
printf("2534 ACCEPT\n");
printf("3402 checking return stuff\n");
return_match_flag = 1;
}
产生这个输出
cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
// printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
// printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
// strings_line_tokens[lower_bound_of_big_boy_counter]);
if (cmp_str9 == 0)
{
printf("2534 ACCEPT\n");
// printf("3402 checking return stuff\n");
return_match_flag = 1;
}
您没有准确描述您想要的输出。放在//
每行的开头是注释代码的简单方法。您可能更喜欢将其放在/*
第一行之前和*/
最后一行之后。我建议不要在自动化脚本中执行此操作,因为/*…*/
注释掉的代码中的任何样式注释都会结束注释(因为/*…*/
样式注释不会嵌套)。当然可以寻找 */
在注释掉的代码中,但这会变得混乱。
但还有另一种方法可以注释掉 C 代码块。任何介于
#if 0
和
#endif
就编译器而言,它基本上从源代码文件中消失了。虽然这会爆炸,如果重叠
与任何其他预处理器 ( #…
) 块一起,它确实可以很好地嵌套。我们#if 0
之前可以写每一个 printf
语句,以及#endif
之后,但我认为检测打印语句块会更好。所以我想出了这个:
awk '
/printf/ { starting_comment=1 }
/printf\("[0-9]* REJECT/ { starting_comment=0 }
/printf\("[0-9]* ACCEPT/ { starting_comment=0 }
{ if (starting_comment) {
starting_comment=0
if (in_a_comment==0) print "#if 0"
in_a_comment=1
}
if (in_a_comment==2) {
print "#endif"
in_a_comment=0
}
print
}
/;/ { if (in_a_comment==1) {
in_a_comment=2
}
}
END {
if (in_a_comment==2) {
print "#endif"
in_a_comment=0
}
}
'
您可能并不真正需要该END
块;仅当输入中的最后一行是语句时它才起作用printf
。当然,C 源代码文件中的最后一行应该始终是}
.
对于上面显示的示例输入,这会产生
cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
#if 0
printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
strings_line_tokens[lower_bound_of_big_boy_counter]);
#endif
if (cmp_str9 == 0)
{
printf("2534 ACCEPT\n");
#if 0
printf("3402 checking return stuff\n");
#endif
return_match_flag = 1;
}
请注意前两个printf
语句如何组合成一个块。