从文件

时间:2016-01-23 19:53:54

标签: regex awk sed

我尝试使用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;
}

有没有办法做到这一点,只有删除多行注释,如果它从文件的第一行开始并留下所有其他注释?

4 个答案:

答案 0 :(得分:4)

这假设在第一条多行注释之前,您的文件中没有任何内容。它只是说在看到结束第一条评论的*/之后开始打印(然后再也不会再次停止,无论看到了什么)。

$ 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 (两个字符都需要使用*/进行转义),然后将标志设置为\并立即转到下一行(不打印)。

1

如果标记f 设置为f,则打印当前行(并回想一下,如果1语句 执行,我们才会到达此处,从而避免打印初始评论的最后一行。)

答案 1 :(得分:2)

使用var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs"); ref.orderByChild("height").on("child_added", function(snapshot) { console.log(snapshot.key() + " was " + snapshot.val().height + " meters tall"); }); 中的GNU sed包裹您的部分/\/\*/,/\*\//d

1,/\*\//{ ... }

输出:


int main(int argc, const char *argv[]) {
/* 
   keep me
*/
    return 0;
}


/* 
   keep me
*/

答案 2 :(得分:0)

如果你的评论都以同样的方式结束 尝试像

这样的东西
awk 'BEGIN {while($1 != "*/") getline}{print}'

否则你将不得不做一些更精彩的事情来查看一行的最后两个字符,直到你找到第一个评论的结尾。

这具有在完成任务后不测试任何行的功能。

答案 3 :(得分:-1)

sed '/\/\*/,/\*\// s/.*//g' filename | awk '!/^$/'
  1. 按照模式范围进行匹配,然后全部替换。
  2. 删除空行
  3. 输出:

      int main(int argc, const char *argv[]) {
            return 0;
            }
    
相关问题