LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 734|回复: 4

sed的一个问题,请教大家

[复制链接]
发表于 2006-4-3 22:09:49 | 显示全部楼层 |阅读模式
写一个脚本来实现C++程序注释的去除。

其中有C语言的注释方式,也有C++语言的注释方式

注释有以下几种方式:


  1. /// 标志此站点在采集时是否出错,链接出错不算错

  2. static int g_error = false;


  3. if(site.find("ftp://") == 0)

  4. int pos3 = site.rfind("@"); //从后开始找,因为密码可能含有@

  5. /**

  6. 从字符串中分离出站点信息, 并加入到站点队列中, 保证不重复



  7. @param[in]  siteString 含有站点信息的字符串

  8. @param[out] siteVec    站点队列

  9. */

  10.         struct struct_string_in_file

  11.         {

  12.                 unsigned short len;

  13.                 char line[1024]; // Fputs及Fgets支持的字符串最大长度(1024)

  14.         };

  15.      
复制代码
  


脚本如下:

  1. #!/bin/sh

  2. sed -i ‘{/^[ \t]*\/\//d'

  3. s/\/\/[^"]*//

  4. s/\/\*.*\*\///

  5. /^[ \t]*\/\*/,/.*\*\//d
  6. }' $1
复制代码


结果发现,上面
[quto]
        struct struct_string_in_file

        {

                unsigned short len;

                char line[1024]; // Fputs及Fgets支持的字符串最大长度(1024)

        };
[/quto]
        这一部分的汉字部分不能够删除,请教大家,这是什么原因?

如果单独只处理上面这一部分,可以删除汉字。但是如果处理整个文件的话,汉字就不能够删除。

注意上面说的汉字,是英文与中文相邻的部分。

附文件如下:

  1. /**

  2. * 定义文件类

  3. *

  4. * 此类简单封装一下系统提供的文件指针,并加入一些特有的操作

  5. *

  6. * @file   file.h

  7. * @author [email]xieyubo@gmail.com[/email]

  8. * @date   2006.1

  9. */



  10. #ifndef FILE_H

  11. #define FILE_H



  12. #include "../sfc-src/sfexception.h"



  13. using namespace SFC;



  14. #include <string>

  15. #include <iostream>



  16. using namespace std;



  17. #include <stdlib.h>

  18. #include <stdio.h>



  19. /**

  20. * 定义文件类

  21. * @note 此类并未经过良好设计,绝对不要滥用,比如说把此类的一个对象直接赋值给另一个对象

  22. */

  23. class File

  24. {

  25.     public:

  26.         /**

  27.         * 构造函数

  28.         *

  29.         * 按指定方式打开文件,均为二进制打开方式

  30.         *

  31.         * @param file_name 文件名

  32.         * @param open_way 打开方式,可为如下值:

  33.         *        'r': 只读打开(默认值)

  34.         *        'w': 只写打开

  35.         *        'a': 添加打开

  36.         */

  37.         File(const string& file_name, const char open_way = 'r') throw(SFException);



  38.         /**

  39.         * 构造函数

  40.         *

  41.         * 按指定方式打开文件,均为二进制打开方式

  42.         *

  43.         * @param file_name 文件名

  44.         * @param open_way 打开方式,可为如下值:

  45.         *        'r': 只读打开(默认值)

  46.         *        'w': 只写打开

  47.         *        'a': 添加打开

  48.         */

  49.         File(const char* file_name, const char open_way = 'r') throw(SFException);



  50.         /**

  51.         * 析构函数

  52.         */

  53.         ~File();



  54.         /**

  55.         * 关闭文件

  56.         */

  57.         void Close();

  58.         

  59.         void Fputs(const char* str);

  60.         

  61.         bool Fwrite(const void* buffer, unsigned int size)

  62.         {         

  63.             return fwrite(buffer, size, 1, fp);

  64.         }

  65.         

  66.         bool Fread(off_t offset, void* buffer, unsigned int size)

  67.         {

  68.             Fseek(offset);

  69.             return Fread(buffer, size);

  70.         }

  71.         

  72.         bool Fread(void* buffer, unsigned int size)

  73.         {

  74.             return fread(buffer, size, 1, fp);

  75.         }

  76.         

  77.         void Fseek(off_t offset)

  78.         {

  79.             fseeko(fp, offset, SEEK_SET);

  80.         }



  81.                 off_t GetFileSize()

  82.                 {

  83.                         off_t pos = Ftell();

  84.                         fseeko(fp, 0, SEEK_END);

  85.                         off_t size = Ftell();

  86.                         Fseek(pos);

  87.                         return size;

  88.                 }



  89.         /**

  90.         获取字符串

  91.         */

  92.         bool Fgets();

  93.         

  94.         /**

  95.         * 保存文件的当前位置, 并跳转到指定位置

  96.         *

  97.         * @param[in] offset 文件需跳转到的指定位置

  98.         */

  99.         void SaveAndSetPos(off_t offset = 0)

  100.         {

  101.             pos = Ftell();

  102.             Fseek(offset);

  103.         }

  104.         

  105.         /**

  106.         * 恢复先前保存的文件位置

  107.         */

  108.         void RestorePos()

  109.         {

  110.             Fseek(pos);

  111.         }

  112.    

  113.         /**

  114.         返回文件指针的位置

  115.         */

  116.         off_t Ftell()

  117.         {

  118.             return ftello(fp);

  119.         }

  120.         

  121.                 bool Ferror()

  122.                 {

  123.                         return ferror(fp);

  124.                 }



  125.                 void Fflush()

  126.                 {

  127.                         fflush(fp);

  128.                 }



  129.         struct struct_string_in_file

  130.         {

  131.                 unsigned short len;

  132.                 char line[1024]; // Fputs及Fgets支持的字符串最大长度(1024)

  133.         };

  134.         

  135.         struct_string_in_file str;

  136.            

  137.     private:

  138.         off_t pos;

  139.         FILE* fp;

  140.          

  141. };



  142. #endif
复制代码
发表于 2006-4-4 09:41:37 | 显示全部楼层

  1. sed '/^[ ]*\/\/\//d' filename | sed 's/\/\/.*//g' | sed '/^[ ]*\/\*\*/,/^[ ]*\*\//d'
复制代码

你的方法应该是可以的!你再试试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-4 18:59:12 | 显示全部楼层
我的正则表达式没有错误,但是就是在匹配到字母与汉字的交接的地方,就不行了
回复 支持 反对

使用道具 举报

发表于 2006-4-4 22:35:56 | 显示全部楼层
是不是locale的问题?
将locale置为C文件中locale试试看?
回复 支持 反对

使用道具 举报

发表于 2006-4-4 22:36:00 | 显示全部楼层
是不是locale的问题?
将locale置为C文件中locale试试看?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表