向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

sh/bash/dash/ksh/zsh等Shell脚本
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#16

帖子 tusooa » 2011-09-03 16:05

那要是""里边有那/**/的,不完了.

代码: 全选

] ls -ld //
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#17

帖子 cjxgm » 2011-09-03 17:15

Rock_Lee 写了:用Shell脚本,删除C源代码中的/*...*/注释,要注意以下这种情况:

/*
...
.../*.....
......*/..\*...
...
*/
C 语言不允许嵌套注释,因此这种情况是不可能存在的
代码着色……
代码着色……
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#18

帖子 fnan » 2011-09-04 18:10

tusooa 写了:那要是""里边有那/**/的,不完了.
# 没注意引号使注释无效,注释又使引号无效,互相影响真个复杂,用sed试试:
#尽量写出复杂的情况测试,改正了一个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++强悍,不过可以用。
Rock_Lee
帖子: 6
注册时间: 2011-09-01 16:05

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#19

帖子 Rock_Lee » 2011-09-05 14:48

感谢楼上各位高手的热心帮助,小弟不胜感激!!只是小弟才疏学浅,大家给予的解答还需要拿回去好好学习和研究一下才能弄明白呢!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#20

帖子 fnan » 2011-09-08 7:38

代码: 全选

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++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#21

帖子 fnan » 2011-09-14 1:07

代码: 全选

sed -r ':A;N;$!bA;s#("([^"]|\\")*")|/\*([^*]*|\**\*[^/*])*\**\*/#\1#g' 2.c
#不用辅助字符的版本,写法很蛋疼。

代码: 全选

perl -e 'local($/);$_=<STDIN>;s#("([^"]|\\")*")|/\*.*?\*/#$1#msg;print' <2.c
#加个perl版。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#22

帖子 chengmoYS » 2011-09-14 16:35

fnan 写了:

代码: 全选

sed -r ':A;N;$!bA;s#("([^"]|\\")*")|/\*([^*]*|\**\*[^/*])*\**\*/#\1#g' 2.c
#不用辅助字符的版本,写法很蛋疼。

代码: 全选

perl -e 'local($/);$_=<STDIN>;s#("([^"]|\\")*")|/\*.*?\*/#$1#msg;print' <2.c
#加个perl版。
sed不太多 请教思路
你能不能把你得这个sed分析下
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#23

帖子 fnan » 2011-09-14 19:16

chengmoYS 写了:
fnan 写了:

代码: 全选

sed -r ':A;N;$!bA;s#("([^"]|\\")*")|/\*([^*]*|\**\*[^/*])*\**\*/#\1#g' 2.c
#不用辅助字符的版本,写法很蛋疼。

代码: 全选

perl -e 'local($/);$_=<STDIN>;s#("([^"]|\\")*")|/\*.*?\*/#$1#msg;print' <2.c
#加个perl版。
sed不太多 请教思路
你能不能把你得这个sed分析下
#可以,醉翁装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++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#24

帖子 fnan » 2011-09-14 20:39

#继续:
/\*([^*]*|\**\*[^/*])*\**\*/
对比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
联系:

Re: 向高手请教个问题,如何用shell脚本删掉C语言中的注释部分?

#25

帖子 Methuselar » 2011-09-20 12:45

sed 和 awk就叫"用shell"了?
Mea Culpa!
回复