我需要使用 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
牧场过去的d
elete 到x
/^\s*\/\*/!bx
如果以注释开头的行不是以注释结尾,仅后跟空格,则末尾有代码,因此b
将d
elete移至x
/\*\/\s*$/!bx
前两个测试可以组合为
/^\s*\/\*.*\*\/\s*$/!bx
如果注释行包含一个 clsing 注释标记,后跟至少一个非空白字符,然后另一个注释开始,那么里面就有代码,所以b
牧场过去的d
elete 到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 */