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

 

转载于:https://www.cnblogs.com/starspace/archive/2008/11/14/1333871.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值