免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yjchlove
打印 上一主题 下一主题

这样的sed怎么写!!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-04-25 12:43 |只看该作者

这样的sed怎么写!!!

原帖由 "forest077" 发表:
这种情况,上面所有人包括我和ad、MM的代码都不能够正确处理。
就当是出个题目,大家再研究研究?呵呵。
程序中的空格很重要,测试大家的代码是否正确,请跟贴者不要随便去掉。
好难哟
ps:把代码去掉,以便粘贴,要不粘贴后有很多tab和空格

论坛徽章:
0
12 [报告]
发表于 2004-04-25 12:52 |只看该作者

这样的sed怎么写!!!

原帖由 "bjgirl" 发表:

把代码去掉,以便粘贴,要不粘贴后有很多tab和空格

???我就是要留着那些空格和tab来测试命令的正确性的呀。不能去掉。因为实际的c程序中是很可能留着一堆的空格和tab键的。反正去掉空格是小case,要留着它们才显示出题目的难度。

论坛徽章:
0
13 [报告]
发表于 2004-04-25 12:55 |只看该作者

这样的sed怎么写!!!

看看我写的一个命令:

  1. sed 's/\([^[:space:]].*\)\(\/\*\)/\1\
  2. \2/g; s/\*\//\
  3. &/g; s/\(\*\/\)\(.*[^[:space:]]\)/\1\
  4. \2/g' test.c |sed '/\/\*/,/\*\//d'
复制代码

注意代码是4行,换行是为了把流中间加上换行,不要把4行并成一行来运行。
用这条代码,可以正确处理我上面举的例子,输出与我最初的设想一模一样,该留的都留下了,该删的都删掉了。
我的系统是sco openserver 5.05

论坛徽章:
0
14 [报告]
发表于 2004-04-25 13:06 |只看该作者

这样的sed怎么写!!!

我是说你贴文件的时候不要用[code],因为用鼠标拷贝后贴到vi里会变形@_@,跟你的原文不一样了

论坛徽章:
0
15 [报告]
发表于 2004-04-25 13:16 |只看该作者

这样的sed怎么写!!!

forget shell script, regex.., 编个 c  program容易些..
MM是否认同?

论坛徽章:
0
16 [报告]
发表于 2004-04-25 13:20 |只看该作者

这样的sed怎么写!!!

原帖由 "Y_" 发表:
forget shell script, regex.., 编个 c  program容易些..
MM是否认同?
我不会C 我想用perl处理应该不难吧! 唉@_@,用perl还是离不开让让头疼的regex....

论坛徽章:
0
17 [报告]
发表于 2004-04-25 13:35 |只看该作者

这样的sed怎么写!!!

不要code变形就更多了,空格和tab全都被过滤掉了,:-(
我贴一下:
$cat test.c
#include <stdio.h>
main()
{
        /*需要整行删除*/
        printf("本句和注释之间的空格不要去掉\n";         /*just a test
        ******需要整行删除
        /////需要整行删除
        需要整行删除,后面空行不要删除*/

        printf("汉字不能被删除\n";

/*test  注意前面空行不能删除
*/         printf("test:前面的空格不要去掉\n";/*a
*/printf("test3\n";
        return(0);
}

论坛徽章:
0
18 [报告]
发表于 2004-04-25 13:37 |只看该作者

这样的sed怎么写!!!

原帖由 "Y_" 发表:

forget shell script, regex.., 编个 c program容易些..

用c来做这个工作就更复杂了,还不如用sed呢。

论坛徽章:
0
19 [报告]
发表于 2004-04-25 14:13 |只看该作者

这样的sed怎么写!!!

是不是很简单?,
没有头疼的regex....

  1. #include <stdio.h>
  2. int main(int argv, char *argc[])
  3. {
  4.         char char1,char2;
  5.         int bflag;
  6.         FILE *fs;
  7.         fs=fopen(argc[1],"r");
  8.         while ((char1=getc(fs))!=EOF){
  9.                 bflag=0;
  10.                 if (char1=='/')
  11.                 {
  12.                         if ((char2=getc(fs))=='/'){
  13.                                 while (char2=getc(fs)!='\n'){}
  14.                                 bflag=1;
  15.                         }
  16.                         else if (char2=='*'){
  17.                                 while ((char1=getc(fs))!=EOF){
  18.                                         if (char1=='*'){
  19.                                                 if ((char2=getc(fs))=='/'){
  20.                                                         bflag=1;
  21.                                                         break;
  22.                                                 }
  23.                                         }
  24.                                 }
  25.                         }
  26.                         if (bflag==1)
  27.                                 continue;
  28.                         putc(char1,stdout);
  29.                         putc(char2,stdout);
  30.                 }
  31.                 putc(char1,stdout);
  32.         }
  33.         fclose(fs);
  34.         return 0;
  35. }
复制代码

论坛徽章:
0
20 [报告]
发表于 2004-04-25 14:30 |只看该作者

这样的sed怎么写!!!

我自然知道用c来做这个工作用什么算法好,工作量有多大,所以我说“用c来做这个工作就更复杂了”。你看看你的这个代码,写了多少字符,用了多少层循环,用了多少个判断,这样的复杂性不能说比我那个sed代码小吧?当然,从运行速度上面来讲,比我那个sed代码快倒是真的。但是,在这里我并不想比较效率,因为shell命令的效率毕竟比不上c编的程序。
还有,就我前面提出的题目,如果有某一行是"行始+若干tab或空格+/*注释*/+若干tab或空格+行末",按我题目的要求这行需要整行删除,用你的这个算法却会保留注释前面和后面的若干tab或空格,这就不符合题意了,若要连前后的"若干tab或空格"一起删除,你这个算法就需要结构性的改造,而不是修补一下就行了。我说得对吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP