向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
-
- 帖子: 6548
- 注册时间: 2008-10-31 22:12
- 系统: 践兔
- 联系:
- cjxgm
- 帖子: 1952
- 注册时间: 2010-04-23 20:40
- 系统: Arch Linux
- 来自: 浙江·杭州
- 联系:
Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
C 语言不允许嵌套注释,因此这种情况是不可能存在的Rock_Lee 写了:用Shell脚本,删除C源代码中的/*...*/注释,要注意以下这种情况:
/*
...
.../*.....
......*/..\*...
...
*/
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
# 没注意引号使注释无效,注释又使引号无效,互相影响真个复杂,用sed试试:tusooa 写了:那要是""里边有那/**/的,不完了.
#尽量写出复杂的情况测试,改正了一个bug:
cat 2.c
#include <stdio.h>
main()
{
long l=0;
char * a[2];
printf("%ld\n",l);
printf ("%ld\n",l);/*."..*/ printf("%s\n","/*123\"*/");*a="/*"/*."."*/;
/*...*/
printf("%ld\n",++l);
/*...
printf("%ld\n",++l);
/*...
printf("%ld\n",++l);\"."
"...*/printf("%ld\n",++l);
}
代码: 全选
sed -r ':A;N;$!bA; :B;s#\*/#&\x1C#g; s#("([^"]|\\")*")?(/\*[^\x1C]*\x1C)?#\1\x1C\3\x1C#g; :C;s#/\*[^\x1C]*\*/\x1C\x1C##g;s#\x1C##g' 2.c
#效果。#include <stdio.h>
main()
{
long l=0;
char * a[2];
printf("%ld\n",l);
printf ("%ld\n",l); printf("%s\n","/*123\"*/");*a="/*";
printf("%ld\n",++l);
printf("%ld\n",++l);
}
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 6
- 注册时间: 2011-09-01 16:05
Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
感谢楼上各位高手的热心帮助,小弟不胜感激!!只是小弟才疏学浅,大家给予的解答还需要拿回去好好学习和研究一下才能弄明白呢!
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
代码: 全选
sed -r ':A;N;$!bA; s#\*/#&\x1C#g; s#("([^"]|\\")*"|/\*[^\x1C]*\x1C)#\1\x1C#g; s#(/\*[^\x1c]*\*/\x1c\x1c|\x1c)##g' 2.c
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
代码: 全选
sed -r ':A;N;$!bA;s#("([^"]|\\")*")|/\*([^*]*|\**\*[^/*])*\**\*/#\1#g' 2.c
代码: 全选
perl -e 'local($/);$_=<STDIN>;s#("([^"]|\\")*")|/\*.*?\*/#$1#msg;print' <2.c
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 125
- 注册时间: 2007-10-22 22:40
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
#可以,醉翁装B,意在推广。
先借助辅助字符,比较好理解:
sed -r ':A;N;$!bA; s#\*/#&\x1C#g; s#("([^"]|\\")*")|/\*[^\x1C]*\x1C#\1#g; s#\x1c##g' 2.c #终极精简。
关键是两个匹配模式,1: ("([^"]|\\")*") 2:/\*[^\x1C]*\x1C
可以看出,其实就是双引号与注释。
这里利用了sed的贪婪特性,如果出现引号结构,会重写一遍,里面如果有注释结构,自然被保护,而有效的注释结构,自然消失。
(下次再说非贪婪正则,现在没空。)
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?
#继续:
/\*([^*]*|\**\*[^/*])*\**\*/
对比perl版可以知道其实就是非贪婪正则写法,sed没非贪婪量词,得自己写,公式是:
([^z1]*|z1*z1([^z2z1]|z2[^z3]|z2z3[^z4]|z...[^zn])*z1*z1...zn #修改了一下,应该没错了,真的蛋疼。
#所以可以用perl正则(言语只是实现算法的工具),我想你是it专业的,可能有不能用perl的时候,可以在.bashrc里加个s函数,加上非贪婪元字符,比如 ** ++ 自动按公式展开,还可以加上\d \e神马的,展开为 [0-9] [a-zA-Z],就是自动写sed正则。
/\*([^*]*|\**\*[^/*])*\**\*/
对比perl版可以知道其实就是非贪婪正则写法,sed没非贪婪量词,得自己写,公式是:
([^z1]*|z1*z1([^z2z1]|z2[^z3]|z2z3[^z4]|z...[^zn])*z1*z1...zn #修改了一下,应该没错了,真的蛋疼。
#所以可以用perl正则(言语只是实现算法的工具),我想你是it专业的,可能有不能用perl的时候,可以在.bashrc里加个s函数,加上非贪婪元字符,比如 ** ++ 自动按公式展开,还可以加上\d \e神马的,展开为 [0-9] [a-zA-Z],就是自动写sed正则。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
- Methuselar
- 帖子: 122
- 注册时间: 2009-06-04 12:06
- 联系: