我试图使用unix工具从源文件的大目录中删除所有初始的多行注释。
例如,我有一个文件testfile.c
/*
testfile.c
get rid of me
*/
int main(int argc, const char *argv[]) {
/*
keep me
*/
return 0;
}
/*
keep me
*/我试过像这样使用sed:
sed '/\/\*/,/\*\//d' testfile.c但是,这删除了所有多行评论,结果是:
int main(int argc, const char *argv[]) {
return 0;
}是否有办法做到这一点,并只删除多行注释,如果它从文件的第一行开始,并保持所有其他评论的机智?
发布于 2016-01-23 20:05:05
这假设在第一个多行注释之前文件中没有任何内容。它只是说,在您看到结束第一个注释的*/之后开始打印(不管看到了什么,都不要再停止)。
$ awk '!f&&/\*\//{f=1;next}f' testfile.c
int main(int argc, const char *argv[]) {
/*
keep me
*/
return 0;
}
/*
keep me
*/解释:
!f && /\*\// { f=1; next }如果没有设置标志f (也就是说,如果f等于0,程序开始时是这样),并且当前行包含模式*/ (两个字符都需要用\进行转义),那么将标志设置为1,然后立即转到下一行(没有打印)。
f如果标志f设置为1,则打印当前行(回想一下,只有当next语句未执行时,我们才到达这里,从而避免打印初始注释的最后一行)。
发布于 2016-01-23 20:05:55
如果您的评论都以相同的方式结束,请尝试如下
awk 'BEGIN {while($1 != "*/") getline}{print}'否则,你将不得不做一些更花哨的事情,看看一行的最后两个字符,直到你找到第一个评论的结尾。
它的特点是在完成任务后不测试任何行。
发布于 2016-01-25 11:46:20
sed '/\/\*/,/\*\// s/.*//g' filename | awk '!/^$/'输出:
int (int,const *argv[]) {返回0;}
https://stackoverflow.com/questions/34968109
复制相似问题