我尝试使用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;
}
有没有办法做到这一点,只有删除多行注释,如果它从文件的第一行开始并留下所有其他注释?
答案 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 '!/^$/'
输出:
int main(int argc, const char *argv[]) { return 0; }