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