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