SED删除C程序注释

时间:2017-09-05 16:49:02

标签: regex linux sed

我需要在linux中使用sed删除C程序中的注释行,假设每个注释行包含开头和结尾标记,之前和之后没有任何其他语句。

例如,下面的代码:

/* a comment line in a C program */
printf("It is /* NOT a comment line */\n");
x = 5; /* This is an assignment, not a comment line */
[TAB][SPACE] /* another empty comment line here */
/* another weird line, but not a comment line */ y = 0;

变为

printf("It is /* NOT a comment line */\n");
x = 5; /* This is an assignment, not a comment line */
/* another weird line, but not a comment line */ y = 0;

我知道这个正则表达式

^\s?\/\*.*\*\/$

匹配我需要删除的行。但是,以下命令:

sed -i -e  's/^\s?\/\*.*\*\/$//g' filename

没有做到这一点。

我不太确定我做错了什么......

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

这样做:

$ sed -e  '/^\s*\/\*.*\*\/$/d' file
printf("It is /* NOT a comment line */\n");
x = 5; /* This is an assignment, not a comment line */
/* another weird line, but not a comment line */ y = 0;

注意:

  1. ^\s?匹配零个或一个空格。看起来您想要匹配零个或一个或多个空格。因此,我们使用^\s*

  2. 由于您要删除行而不是用空行替换它们,因此要使用的命令d用于删除。

  3. 没有必要用/分隔正则表达式。我们可以使用|,例如:

    sed -e  '\|^\s*/\*.*\*/$|d' file
    

    这消除了逃避/的需要。根据正则表达式/出现的次数,这可能会也可能不会更简单,更清晰。

答案 1 :(得分:1)

这可能就是你要找的东西:

$ awk '{o=$0; gsub(/\*\//,"\n"); gsub(/\/\*[^\n]*\n/,"")} NF{print o}' file
printf("It is /* NOT a comment line */\n");
x = 5; /* This is an assignment, not a comment line */
/* another weird line, but not a comment line */ y = 0;
/* first comment */ non comment /* second comment */

以上内容在此输入文件上运行:

$ cat file
/* a comment line in a C program */
printf("It is /* NOT a comment line */\n");
x = 5; /* This is an assignment, not a comment line */
     /* another empty comment line here */
/* another weird line, but not a comment line */ y = 0;
/* first comment */ non comment /* second comment */

并使用awk,因为一旦你使用awk过去简单的s / old / new / everythings更容易(更高效,更便携等)。以上将删除所有空行 - 如果这是一个问题,那么更新您的示例输入/输出以包含它,但这是一个简单的修复。

答案 2 :(得分:0)

您正在做的是用空字符串替换正则表达式

sed -i -e  's/^\s?\/\*.*\*\/$//g' filename

这意味着

sed -i -'s/pattern_to_find/replacement/g' : g means the whole file.

您需要做的是删除带有正则表达式的行

sed -i -e  '/^\s?\/\*.*\*\/$/d' filename