免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4390 | 回复: 11
打印 上一主题 下一主题

[文本处理] 请问 sed 如何批量为代码添加注释? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-04 09:16 |只看该作者 |倒序浏览
本帖最后由 nizul 于 2015-11-04 09:16 编辑

假设有这样类型的代码 test.sqc:
/**
* @file test.sqc
* @brief 结构体
* @date 2012-12-18
* @author: 小狼
* @details
*------------------------------------------------------------
* 修改日期: 2015-10-09
* 修改人员: XXXXXX
* 修改描述:
* 备注信息: XXXXXXX
* 版本信息: <ver>
* 专题信息: XXXXXXXX专题包
* ----------------------------------------------------------*/
EXEC SQL     BEGIN DECLARE      SECTION;
                double        mi_jsmx_dti_dcreate_date                 = 0;        //文件录入日期
                char        mi_jsmx_dti_sbusiness_type[11]        = {0};        //业务类别
                double        mi_longdti_ddividends_tax                = 0;       
                long    mi_jsmx_dti_scp_code[9]                        = {0};
EXEC SQL END DECLARE SECTION;

                double        mis_tax                = 0;       
                long        mi_je[9]
        
/* --------------------------------------------------------------
* 函数名称:SignalTerm
* 函数功能:安装信号集处理函数
* 入口参数:
* 返回类型:
* 备    注:
* -------------------------------------------------------------*/
BOOL SignalTerm()
{
    struct sigaction act;
   
    act.sa_handler = sigterm_trf;  
    act.sa_flags   = 0;  
    sigemptyset(&act.sa_mask);
    sigaction(SIGTERM,&act,NULL);
    sigaction(SIGHUP,&act,NULL);
    sigaction(SIGINT,&act,NULL);
    sigaction(SIGQUIT,&act,NULL);
    sigaction(SIGUSR1,&act,NULL);
    sigaction(SIGUSR2,&act,NULL);
    return TRUE;
}
......

现在想批量给这种代码添加注释抬头,我的做法是这样的:

sed  '/^\/\*/,/\*\/$/{c\
\* ----------------------------------------------------------\
\* 修改日期: 2015-10-09\
\* 修改人员: add_comment\
\* 修改描述: \
\* 备注信息: XXXXXXXXXXXX
\* 版本信息: <ver>\
\* 专题信息: XXXXXX专题包\
\* ---------------------------------------------------------\*\/
}' test.sqc


但是 '/^\/\*/,/\*\/$/ 这种写法又会匹配修改到下面的 SignalTerm 函数的抬头,请问应该怎样只在文件头添加注释呢?


最终效果希望变成下面这个样子:
/**
* @file test.sqc
* @brief 结构体
* @date 2012-12-18
* @author: 小狼
* @details
*------------------------------------------------------------
* 修改日期: 2015-10-09
* 修改人员: XXXXXX
* 修改描述:
* 备注信息: XXXXXXX
* 版本信息: <ver>
* 专题信息: XXXXXXXX专题包
* ----------------------------------------------------------
* 修改日期: 2015-10-09
* 修改人员: add_comment
* 修改描述:
* 备注信息: XXXXXXXXXXXX
* 版本信息: <ver>
* 专题信息: XXXXXX专题包
* ---------------------------------------------------------*/
EXEC SQL     BEGIN DECLARE      SECTION;
                double        mi_jsmx_dti_dcreate_date                 = 0;        //文件录入日期
                char        mi_jsmx_dti_sbusiness_type[11]        = {0};        //业务类别
                double        mi_longdti_ddividends_tax                = 0;       
                long    mi_jsmx_dti_scp_code[9]                        = {0};
EXEC SQL END DECLARE SECTION;

                double        mis_tax                = 0;       
                long        mi_je[9]
        
/* --------------------------------------------------------------
* 函数名称:SignalTerm
* 函数功能:安装信号集处理函数
* 入口参数:
* 返回类型:
* 备    注:
* -------------------------------------------------------------*/
BOOL SignalTerm()
{
    struct sigaction act;
   
    act.sa_handler = sigterm_trf;  
    act.sa_flags   = 0;  
    sigemptyset(&act.sa_mask);
    sigaction(SIGTERM,&act,NULL);
    sigaction(SIGHUP,&act,NULL);
    sigaction(SIGINT,&act,NULL);
    sigaction(SIGQUIT,&act,NULL);
    sigaction(SIGUSR1,&act,NULL);
    sigaction(SIGUSR2,&act,NULL);
    return TRUE;
}
......

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
2 [报告]
发表于 2015-11-04 10:37 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2015-11-04 11:27 |只看该作者
回复 2# yjh777
谢谢你的回答,但是能否给个样例呢,我觉得像这种情况不能用 s 替换的命令啊

   

论坛徽章:
0
4 [报告]
发表于 2015-11-04 11:30 |只看该作者
我觉得问题的关键是要 sed 只匹配一次,应该怎么做?

论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
5 [报告]
发表于 2015-11-04 11:57 |只看该作者
本帖最后由 sync_1521 于 2015-11-04 12:17 编辑

sed  '/\*\/$/{s#\*/$#\nabc#;q}' file  把abc换成你的东西试试
貌似不行。。后面的东西都没了。

sed  '0,/\*\/$/s#\*/$#\nabc#' file

论坛徽章:
0
6 [报告]
发表于 2015-11-04 13:28 |只看该作者
回复 5# sync_1521
谢谢你,不过 起始的 /* 和 结束的 */ 必须要匹配的吧,不能从 0,/\*\/$/ 这样的地址的

   

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
7 [报告]
发表于 2015-11-04 14:04 |只看该作者
本帖最后由 yjh777 于 2015-11-04 14:25 编辑

[yjh@f22 ~]$ sed -f addcomment.sed  ttt.txt
/**
* @file test.sqc
* @brief 结构体
* @date 2012-12-18
* @author: 小狼
* @details
*------------------------------------------------------------
* 修改日期: 2015-10-09
* 修改人员: XXXXXX
* 修改描述:
* 备注信息: XXXXXXX
* 版本信息: <ver>
* 专题信息: XXXXXXXX专题包
* ----------------------------------------------------------*/
* ----------------------------------------------------------
* 修改日期: 2015-10-09
* 修改人员: add_comment
* 修改描述:
* 备注信息: XXXXXXXXXXXX
* 版本信息: <ver>
* 专题信息: XXXXXX专题包
* ---------------------------------------------------------*/
EXEC SQL     BEGIN DECLARE      SECTION;
                double        mi_jsmx_dti_dcreate_date                 = 0;        //文件录入日期
                char        mi_jsmx_dti_sbusiness_type[11]        = {0};        //业务类别
                double        mi_longdti_ddividends_tax                = 0;      
                long    mi_jsmx_dti_scp_code[9]                        = {0};
EXEC SQL END DECLARE SECTION;

                double        mis_tax                = 0;      
                long        mi_je[9]
        
/* --------------------------------------------------------------
* 函数名称:SignalTerm
* 函数功能:安装信号集处理函数
* 入口参数:
* 返回类型:
* 备    注:
* -------------------------------------------------------------*/
BOOL SignalTerm()
{
    struct sigaction act;
   
    act.sa_handler = sigterm_trf;  
    act.sa_flags   = 0;  
    sigemptyset(&act.sa_mask);
    sigaction(SIGTERM,&act,NULL);
    sigaction(SIGHUP,&act,NULL);
    sigaction(SIGINT,&act,NULL);
    sigaction(SIGQUIT,&act,NULL);
    sigaction(SIGUSR1,&act,NULL);
    sigaction(SIGUSR2,&act,NULL);
    return TRUE;
}
......
  1. [yjh@f22 ~]$ cat addcomment.sed
  2. /^\/\*/ {
  3.     :loop
  4.     /\*\//! {
  5.         N;
  6.         b loop
  7.     };
  8.     s/.*@file test.sqc.*/&\n\/* ----------------------------------------------------------\n* 修改日期: 2015-10-09\n* 修改人员: add_comment\n* 修改描述:\n* 备注信息: XXXXXXXXXXXX\n* 版本信息: <ver>\n* 专题信息: XXXXXX专题包\n* ---------------------------------------------------------*\//
  9. }
复制代码

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
8 [报告]
发表于 2015-11-04 14:06 |只看该作者
nizul 发表于 2015-11-04 11:27
回复 2# yjh777
谢谢你的回答,但是能否给个样例呢,我觉得像这种情况不能用 s 替换的命令啊


见楼上,链接里其实有例子~~

论坛徽章:
0
9 [报告]
发表于 2015-11-04 14:50 |只看该作者
回复 8# yjh777

太谢谢啦,你的脚本解决了我的问题,非常感激!
另外,我能问下,那个 s 替换的命令里面 & 符号的作用吗?
   

论坛徽章:
0
10 [报告]
发表于 2015-11-04 14:53 |只看该作者
另外,综合以上两位大侠的回答,我发现这个脚本也是好用的:
sed '1{/^\/\*/{:loop /\*\/$/!{N; b loop};s#\*\/$#\
\* 修改日期: XXXXXXXXXXX\
\* 修改人员: add_comment\
\* 修改描述: XXXXXXXXXXX\
\* 备注信息: XXXXXXXXXXXX\
\* 版本信息: <ver>\
\* 专题信息: XXXXXX专题包\
\* ---------------------------------------------------------\*\/\
#}}' test.sqc

如果还有更好的方法,欢迎大家讨论
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP