免费注册 查看新帖 |

Chinaunix

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

终于不再潜水了,第一次发贴问一个sed的难题,请脚本大师帮忙! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-29 23:38 |只看该作者 |倒序浏览
10可用积分
最近在做性能优化,自己写了一个驱动桩,想插入现有产品的代码工程中

例子如下:
   
void func()
{
    /*局部变量定义*/
   int a=0;

   /*入参检查*/
   xxx

   if()
   {
     return;
   }


   if()
   {
     return;
   }
}



插入后如下:
   
void func()
{
    /*局部变量定义*/
   int a=0;
   

   MPTC_PFM_Enter;
   /*入参检查*/
   xxxxx

   if()
   {
      
MPTC_PFM_Leave;

       return;
   }

   
   if()
   {
      MPTC_PFM_Leave;

      return;
   }

   MPTC_PFM_Leave;
   return;

}



     算法:
     第一遍匹配插入,我想先查找注视部分,然后替换。

sed /^{/, /^}/{
/^\([[:space:]]\)*\/\*入参检查\*\//{
s//\n\1MPTC_PFM_Enter;&/
}
}

     第二遍匹配插入,先过滤插入过的函数,然后查找第一次匹配的if,switch,或是赋值语句

sed /^{/, /^}/{
/^\([[:space:]]\)*\/\*入参检查\*\//!{
/^\([[:space:]]\)*if/{
s//\n\1MPTC_PFM_Enter;&/
}
}
}


     但是不能实现预期的效果,达成效果如下:

   
void func()
{
    /*局部变量定义*/
   int a=0;
   

   MPTC_PFM_Enter;
   /*入参检查*/
   xxxxx

   MPTC_PFM_Enter;
   if()
   {
      
MPTC_PFM_Leave;

       return;
   }

   
   MPTC_PFM_Enter;
   if()
   {
      MPTC_PFM_Leave;

      return;
   }


}



     这个脚本应该如何去实现啊?还有如何查找到函数末尾遗漏的return语句?

[ 本帖最后由 sonicsky 于 2009-12-30 22:50 编辑 ]

最佳答案

查看完整内容

[ 本帖最后由 beginner-bj 于 2009-12-30 09:28 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2009-12-29 23:38 |只看该作者

  1. awk '
  2. /入参检查/{a=$0;sub(/\/.*/,"MPTC_PFM_Enter;");$0=$0"\n"a}
  3. /return;/{a=$0;sub("return;","MPTC_PFM_Leave;");$0=$0"\n"a}
  4. NR>2{print y}
  5. {y=x; x=$0}
  6. END{if (y~" *}") {print y"\n   MPTC_PFM_Leave;\n   return;\n"x}else {print y"\n"x}}' file
复制代码

[ 本帖最后由 beginner-bj 于 2009-12-30 09:28 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-12-30 00:03 |只看该作者

  1. sed '/入参检查/i\YOUR_STRING'
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2009-12-30 00:12 |只看该作者
sed 's/入参检查\|if/MPTC_PFM_Enter;\n&;/;s/return;/MPTC_PFM_Leave;\n&/' urfile

论坛徽章:
0
5 [报告]
发表于 2009-12-30 23:15 |只看该作者
感谢各位兄弟帮助,可能我一开始没有说清楚,我想达成的效果如下,我困惑的不知道如何匹配和插入MPTC_PFM_Enter;

void func()
{
    /*局部变量定义*/
   int a=0;
   

   MPTC_PFM_Enter;
   /*入参检查*/
   xxxxx

   if()
   {
      
MPTC_PFM_Leave;

       return;
   }

   
   if()
   {
      MPTC_PFM_Leave;

      return;
   }

   MPTC_PFM_Leave;
   return;

}




    只用sed似乎搞不定, 我后来用awk实现了插入MPTC_PFM_Enter;

awk 'BEGIN {isFunStart=0;isInsert=0;}
{
    if (isFunStart==0 && $0~/^{/) {isFunStart=1;print $0;}

    else if (isFunStart==1 && isInsert==0 ($0~/MPTC_PFM_Enter;/)) {isInsert=1;print $0;}
    else if (isFunStart==1 && isInsert==0 && ($0~/^[[:space:]]*[a-zA-Z\-\>\.]*^[[:space:]]*=/)) {isInsert=1;printf "\n    MPTC_PFM_Enter;\n"; print $0;}#匹配第一次赋值
    else if (isFunStart==1 && isInsert==0 && ($0~/if/ || $0~/switch/ || $0~/for/) {isInsert=1;printf "\n    MPTC_PFM_Enter;\n"; print $0;}
    else {print $0;}
}'
$filename > $filename.new


   但是还有一个缺陷,对于VOID类型的函数,如果遗漏了return就不能插入MPTC_PFM_Leave;

  为了答谢兄弟的帮助,附上我以前找到的资料《sed的大师级用法》

[ 本帖最后由 sonicsky 于 2010-1-1 23:05 编辑 ]

sed的大师级用法.rar

35.45 KB, 下载次数: 38

sed 高级功能的介绍

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2009-12-31 08:36 |只看该作者
5楼那段代码有好多语法错啊

论坛徽章:
0
7 [报告]
发表于 2009-12-31 09:17 |只看该作者
这里已经有好多个大师。

论坛徽章:
0
8 [报告]
发表于 2010-01-01 23:09 |只看该作者

回复 #1 sonicsky 的帖子

在公司不能上外网,这些代码是我凭记忆写的,平时写脚本不多,已经修改了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP