从 C 程序中删除(某些)注释

从 C 程序中删除(某些)注释

我需要使用 bash 脚本从 C 程序中删除全行旧式注释,即在同一行上开始 ( /*) 和结束 ( */) 的注释,而同一行上没有代码。这是 C 程序的示例:

/* Comment 1 */
printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
            /* Comment 4 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7

但我需要它看起来像这样:

printf("It is /* Comment 2 */\n");
 x = 5; /* Comment 3 */
 /* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7

我确实知道如何删除所有评论,但只是不确定如何删除某些评论。

该脚本应从文本文件读取输入,并将输出写入另一个文件,并且所有 I/O 文件名必须在命令行中给出。

答案1

这个sed是便携式的:

sed '\_^[[:blank:]]*/\*.*\*/[[:blank:]]*$_d' file.c

^所有以零个或多个空格 ( )[[:blank:]]*开头 ( ) 、开始注释 ( /\*) 、包含其他内容 ( .*) 、结束注释 ( \*/) 以及该行其余部分仅包含空格 ( )的所有行都[[:blank:]]*将被d删除。当然,您也可以使用 来做到这一点grep -v

请注意,这也会删除诸如

/* between two comments */ x = 0; /* could be some code */

答案2

这与菲利浦斯的回答除了

  • 它用作|正则表达式分隔符(我个人的偏好)。
  • 它使用[[:space:]]而不是[[:blank:]][[:space:]]包括非图形字符,如垂直制表符、换页符和回车符(除了空格和制表符之外);由于 C 将所有这些空白字符视为空格,因此 [[:space:]]实际上是用于处理 C 代码的更好的字符类。和
  • 它处理同一行上多个注释的边缘情况。

sed '\|^[[:space:]]*/\*.*\*/[[:space:]]*$| { \|\*/.*[^[:space:]]|!d }'

正如 Philippos 的回答一样,它检查该行中的第一个非空白内容是否是 ,/* 并且该行上的最后一个非空白内容是否是*/。如果这是真的,我们可能有一个完整的评论;被罢免的候选人。在这种情况下,输入{...} 并查找*/后面跟着非空白的内容;即, a */这不是该行的最后一个非空白内容。如果我们找到了这一点,那么我们就知道我们已经找到了第一个评论的结尾,并且该行还有其他内容。在这种情况下,什么也不做。要是我们找到*/该行内部的 a,然后删除该行。

答案3

使用 sed 命令测试并运行良好

命令:

  sed -r "s/^\s+//g" filename| sed '/^\/\*.*\*\/$/d'

输出:

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
/*
* Comment 6
*/
// Comment 7

答案4

这应该可以解决code评论之间括号的问题

sed  -E '/^\s*\/\*/!bx ; /\*\/\s*$/!bx ; /\*\/\s*\S+.*\/\*/bx ; d;  :x' draft 

如果一行不以仅由空格开头的注释标记开头,那么它以代码开头,因此b牧场过去的delete 到x

/^\s*\/\*/!bx    

如果以注释开头的行不是以注释结尾,仅后跟空格,则末尾有代码,因此bdelete移至x

/\*\/\s*$/!bx

前两个测试可以组合为

/^\s*\/\*.*\*\/\s*$/!bx

如果注释行包含一个 clsing 注释标记,后跟至少一个非空白字符,然后另一个注释开始,那么里面就有代码,所以b牧场过去的delete 到x

/\*\/\s*\S+.*\/\*/bx

由于我们发现没有有效的代码然后删除

d

否则什么都不做就完成

x

测试于

/* Comment 1 */
printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
            /* Comment 4 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0;  /*some code */

输出是

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0; /*some code */

相关内容