我需要在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
没有做到这一点。
我不太确定我做错了什么......
感谢您的帮助。
答案 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;
注意:
^\s?
匹配零个或一个空格。看起来您想要匹配零个或一个或多个空格。因此,我们使用^\s*
。
由于您要删除行而不是用空行替换它们,因此要使用的命令d
用于删除。
没有必要用/
分隔正则表达式。我们可以使用|
,例如:
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