免费注册 查看新帖 |

Chinaunix

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

请教一下,用shell如何完成以下功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-20 16:50 |只看该作者 |倒序浏览
如题,一个程序中有多个begintran和endtran,现在有冲突,需要将中间多余的begintran和endtran注掉,只保留最外层的一个begintran和endtran,如何实现这个功能?请大家赐教,多谢!

论坛徽章:
0
2 [报告]
发表于 2008-05-20 17:16 |只看该作者
最好给个格式,我大概写一个代码如下: 用 #表示注释

  1. awk '/begintran/ {flag++}
  2.      {if (flag>1) {print "#"$0} else {print $0}}
  3.      /endtran/ {flag--}' urfile  > newfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-05-20 18:35 |只看该作者
多谢你回帖,不过还是有点问题,我随便写了个文件来试验此程序,发现执行完后如下(/代表注释)
gsgjlskjglk
BEGINTRAN
fdgdsg
fgfgfhghgh
/BEGINTRAN
/dgf
/fhg
/  jhgfh
/    ENDTRAN
fdsghg dggfjhj jhgjkhgj
hgfdh sdgh
ENDTRAN
sgfhgh
df

论坛徽章:
0
4 [报告]
发表于 2008-05-20 18:36 |只看该作者
接上条
中间的内容我不想给注释,只对BEGINTRAN和ENDTRAN加注释

论坛徽章:
0
5 [报告]
发表于 2008-05-20 18:57 |只看该作者
那就更简单了

  1. awk '!(/begintran/||/endtran/)
  2.        /begintran/ {if ((++flag)>1) {print "/"$0} else {print}}
  3.        /endtran/ {if ((flag--)>1) {print "/"$0} else {print}}' urfile  > newfile
复制代码

[ 本帖最后由 jinl 于 2008-5-20 18:58 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-05-20 19:04 |只看该作者
我的程序多加了几个begintran和endtran,只保留第一个begintran和最后一个endtran
中间出现的begintran和 endtran都注释掉,运行完你的程序后如下
gsgjlskjglk
BEGINTRAN
fdgdsg
fgfgfhghgh
/BEGINTRAN
dgf
fhg
/ENDTRAN
  jhgfh
    ENDTRAN
BEGINTRAN
fdsghg dggfjhj jhgjkhgj
hgfdh sdgh
ENDTRAN
sgfhgh
df

ENDTRAN
不好意思,还要麻烦你费心,谢谢

论坛徽章:
0
7 [报告]
发表于 2008-05-20 19:40 |只看该作者

  1. perl -e '
  2. $i=0;
  3. while(<>){
  4.         push(@text,$_);
  5.         push(@start,$i) if /BEGINTRAN/;
  6.         push(@end,$i) if /ENDTRAN/;
  7.         $i++;
  8. }

  9. if(scalar @start >1 ){
  10.         $start=$start[1];
  11.         $end=$end[scalar @end -2];
  12.         for($j=0;$j<scalar @text;$j++){
  13.                 $s=($j>=$start && $j<=$end)?"/":"";
  14.                 print $s,$text[$j];
  15.         }
  16. }' <数据文件
复制代码

论坛徽章:
0
8 [报告]
发表于 2008-05-20 20:07 |只看该作者
哦。。。。感谢5楼和7楼的朋友
我调整了一下,问题已经解决了
我的那个测试文件写的有点问题,5楼朋友的程序可以实现
谢谢

论坛徽章:
0
9 [报告]
发表于 2008-05-20 22:10 |只看该作者
能帮忙分析一下吗?

awk '!(/begintran/||/endtran/)
       /begintran/ {if ((++flag)>1) {print "/"$0} else {print}}  
       /endtran/ {if ((flag--)>1) {print "/"$0} else {print}}' urfile  > newfile

当遇到地一个begintran时, 初试flag=0,(++flag) flag=1 因为1>1 所以 执行 print,
当遇到第一个endtran时, flag=1,(flag--) flag=0, 因为1>1, 所以执行 print,这就是说 第一个endtran 也不会加行 /

按照我这样的分析,不就所有的 begintran和endtran都不会加上/ 了吗? 能帮我分析一下,我的思路在哪里错了?

[ 本帖最后由 lousia 于 2008-5-20 22:36 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-05-20 22:18 |只看该作者
当遇到地一个begintran时, 初试flag=0,(++flag) flag=1 因为1>1 所以 执行 print,
当遇到第一个endtran时, flag=1,(flag--) flag=0, 因为0>1, 所以执行 print,这就是说 第一个endtran 也不会加行 /

按照我这样的分析,不就所有的 begintran和endtran都不会加上/ 了吗? 能帮我分析一下,我的思路在哪里错了?

你的分析是只有一对begin/end的情况,自然不会加上/,要分析多个bengin/end嵌套的情况,再对照代码看

[ 本帖最后由 jinl 于 2008-5-20 22:20 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP