免费注册 查看新帖 |

Chinaunix

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

请教高手,如何取出文件中两相同字符串之间所有内容,放置到相应位置? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-22 16:06 |只看该作者 |倒序浏览
例如:


A文件:

test(ABC1) {
.
.
.
.
}
test(ABC1)
test(DEF2){
.
.
.
}
test(DEF2)



B文件:

test(ABC1){
{...
{...
   {...
    }
   }
  }
}
test(DEF2){
{...
{...
   {...
    }
   }
  }
}


需要取出A文件中,2个test(ABC1)之间(包括所在行)所有行,放入B文件中,test(ABC1)后面的倒数第二个括号所在那行。。。。。

每个test()里面有不同的字符,但是每个都做相应处理。

太难了,求助~~~叩谢~~~

[ 本帖最后由 qyaqin 于 2009-12-22 16:08 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-22 16:10 |只看该作者
例子中,完成之后如下:

test(ABC1){
{...
{...
   {...
    }
   }
test(ABC1) {
.
.
.
.
}
test(ABC1)
  }
}
test(DEF2){
{...
{...
   {...
    }
   }
test(DEF2){
.
.
.
}
test(DEF2)
}
}

论坛徽章:
0
3 [报告]
发表于 2009-12-22 19:58 |只看该作者
有点难,顶一下

论坛徽章:
0
4 [报告]
发表于 2009-12-22 23:01 |只看该作者
  1. awk 'NR==FNR{if ($0==v&&T) {a[v]=a[v]"\n"$0;T=0;v=""}if (/.*\(.*\) *{/) {split($0,m," *{");v=m[1];a[v]=$0;T=1;next}if (T) a[v]=a[v]"\n"$0}NR>FNR{if (/.*\(.*\) *{/) {if (T1) for (i=n;i>0;i--) {if (b[i]~/}/) o++;if (o==2){num=i;break}}if (num) {for (i=1;i<num;i++) print b[i];print a[v]""b[num];for (i=num+1;i<=n;i++) print b[i]}n=0;T1=0;o=0;num=0;delete b;split($0,m," *{");v=m[1];if (v in a) {T1=1;b[++n]=$0;next}}if (T1) {b[++n]=$0;next}print}END{if (T1) for (i=n;i>0;i--) {if (b[i]~/}/) o++;if (o==2){num=i;break}}if (num) {for (i=1;i<num;i++) print b[i];print a[v]""b[num];for (i=num+1;i<=n;i++) print b[i]}}' A B
复制代码

  1. [root@Mylinux tmp]# cat A
  2. test(ABC1) {
  3. Abc1.
  4. }
  5. test(ABC1)
  6. test(DEF2){
  7. def2.
  8. .
  9. }
  10. test(DEF2)
  11. kkkk
  12. [root@Mylinux tmp]# cat B
  13. oo
  14. test(ABC1){
  15. {...
  16. {...
  17.    {...
  18.     }
  19.    }
  20.   }
  21. k
  22. }
  23. oo
  24. test(DEF2){
  25. {...
  26. {...
  27.    {...
  28.     }
  29.    }
  30.   }
  31. o
  32. }

  33. [root@Mylinux tmp]# awk 'NR==FNR{if ($0==v&&T) {a[v]=a[v]"\n"$0;T=0;v=""}if (/.*\(.*\) *{/) {split($0,m," *{");v=m[1];a[v]=$0;T=1;next}if (T) a[v]=a[v]"\n"$0}NR>FNR{if (/.*\(.*\) *{/) {if (T1) for (i=n;i>0;i--) {if (b[i]~/}/) o++;if (o==2){num=i;break}}if (num) {for (i=1;i<num;i++) print b[i];print a[v]""b[num];for (i=num+1;i<=n;i++) print b[i]}n=0;T1=0;o=0;num=0;delete b;split($0,m," *{");v=m[1];if (v in a) {T1=1;b[++n]=$0;next}}if (T1) {b[++n]=$0;next}print}END{if (T1) for (i=n;i>0;i--) {if (b[i]~/}/) o++;if (o==2){num=i;break}}if (num) {for (i=1;i<num;i++) print b[i];print a[v]""b[num];for (i=num+1;i<=n;i++) print b[i]}}' A B
  34. oo
  35. test(ABC1){
  36. {...
  37. {...
  38.    {...
  39.     }
  40.    }
  41. test(ABC1) {
  42. Abc1.
  43. }
  44. test(ABC1)  }
  45. k
  46. }
  47. oo
  48. test(DEF2){
  49. {...
  50. {...
  51.    {...
  52.     }
  53.    }
  54. test(DEF2){
  55. def2.
  56. .
  57. }
  58. test(DEF2)  }
  59. o
  60. }

  61. [root@Mylinux tmp]#
复制代码

论坛徽章:
0
5 [报告]
发表于 2009-12-23 11:05 |只看该作者
唉,不行呃。

test(***)这样的格式是固定的,且只挑这样的处理。

其他的比如test123()都不能受影响。

并且A不是只有单纯这样固定的格式,还有些其他零零散散的东西。但是只取出形如test(***)这样的每段。。。

晕。是不是太复杂了

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2009-12-23 11:09 |只看该作者
应该是没有把问题描述清楚吧,所以复杂了。

论坛徽章:
0
7 [报告]
发表于 2009-12-23 11:14 |只看该作者

回复 #4 ywlscpl 的帖子

太 牛了。。。看的都晕了

论坛徽章:
0
8 [报告]
发表于 2009-12-23 11:18 |只看该作者

回复 #5 qyaqin 的帖子

其他的比如test123()都不能受影响。

把正则/.*\(.*\) *{/改成/.*\(.+\) *{/
即可

论坛徽章:
0
9 [报告]
发表于 2009-12-23 11:50 |只看该作者
先谢谢ywlscpl 的无私帮助。。。 不过还是未解决 =。=

可能俺的表述能力太差。。。

现把实际例子放在附件里。

需要把a文件中,以cell(A0I13D1)开头,并以/*cell(A0I13D1)*/结尾的第16648~17096行,插入到,b文件的第17654行。可以看到b文件的17201行,也是cell(A0I13D1)开头的,即插入到相对应的那段的倒数第二个大括号内。

好人帮忙帮到底吧。。。。再次感谢~~~~~~~·

test.zip

1.98 MB, 下载次数: 16

论坛徽章:
0
10 [报告]
发表于 2009-12-23 11:52 |只看该作者
就是类似于cell(****)这样的,都做同样操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP