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

去掉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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值