On 2006年11月30日 22:24, amateur write:
这行是查找C注释块的结束标识“*/”,如果没有找到它,并且也不是文件的最后一 行,那么就追加读入下一行,并回到这个循环的最开始位置,继续处理。On Thu, Nov 30, 2006 at 11:05:47AM +0800, Xie Yanbo wrote:On 2006年11月30日 10:14, amateur write:那是我没有表达清楚了,我的主要目的是去掉源代码中的注释,这个需要在多行中进行搜索匹配,应该不是多行替换,因为 sed 的替换操作好似只能在一行内 使用,而 sed 的行操作 (d/p) 都是针对整行进行的,比如我用匹配 main 函数 的方法匹配注释的话,就会是的包含有 /* */ 注释的所有行都会被删除。象下面的例子就不能用这种方法: int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ }请看一下 remove_c_comment.sed 是否就是你要的脚本。正是我要的功能,谢谢! 不过你发到我的个人邮箱里了,能否解释一下 /\*\//!{ $!{ N; bt } } 的意思,看不懂其中 !{ $!{ N; bt } } 这个操作的意义
0$ cat remove_c_comment.sed :t /\/\*/,/\*\// { /\*\//!{ $!{ N; bt } } s/\/\*.*\*\///; } 0$ cat test.c int main() { do_something; /* this block is commented do_other_thing; ... do_third_thing; */ return 0; } 0$ cat test.c | sed -f remove_c_comment.sed int main() { do_something; return 0; } 0$-------------------------