去掉c代码中的注释[转]

#去掉c代码中的注释

#我的思路基本是:
#1、除出 // comment
#2、对于 /* comment */,由于可能跨行,sed不大好处理。
#    a. 将 /* 替换成 \n^/*,*/ 替换成 */\n,然后把 /* 和 */ 中间的行删除
#    b. 在 /* 开始,到 */ 之前那些行通过 N读入,然后一次过删除。
#    c. /* 行从 /*删除,在遇到 */之前的行删除,*/行 删除 */之前内容。


#    a. 将 /* 替换成 \n^/*,*/ 替换成 */\n,然后把 /* 和 */ 中间的行删除
sed '
        /\/\*/{
                h
                G
                s-/\*.*\(\n\)-\1-
        }
' a |sed '
        /\*\//{
                h
                G
                s-\(\n\).*\*/-\1-
        }
' |sed '/\/\*/,/\*\//d;s-//.*--; '


#    b. 在 /* 开始,到 */ 之前那些行通过 N读入,然后一次过删除。
sed '
        s%//.*%%

        /\/\*/{
        :next
                N
                /\*\//!b next
                s%/\*.*\*/%%
        }
        /\/\*/b next
' a


#    c. /* 行从 /*删除,在遇到 */之前的行删除,*/行 删除 */之前内容。
sed '
        s-/\*.*\*/--

        /\/\*/{
        :comment
                s-/\*.*--
        :next
                n
                # d dosent work, so s-^.-//&-
                s-^.-//&-
                /\*\//!b next
                s-^.*\*/--
        }
        /\/\*/b comment
' a |sed 's-//.*--'

# 另外,可以用 gcc -E cfile

 

# awk版

awk '
function clearComment(){

        if ($0~/\/\*/){

                if ($0~/\*\//) sub(/\/\*.*\*\//, "");
                else sub(/\/\*.*/, "");
                print;

                while (getline == 1 && !($0~/\*\//));
               
                sub(/.*\*\//, "");


        } else if ($0~/\/\//) sub(/\/\/.*/, "");

        if ($0~/\/\*/) clearComment();
        else print;
}

{
        clearComment();
}' a

 

posted on 2008-11-14 21:26  starspace  阅读(377)  评论(0编辑  收藏  举报

导航