免费注册 查看新帖 |

Chinaunix

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

[文本处理] 提取数字并循环打印 [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-28 10:09 |只看该作者 |倒序浏览
本帖最后由 yestreenstars 于 2013-03-01 10:41 编辑

好久没发过主题了,最近shell版块没什么人发表文本处理的帖子,我闲着没事干就跑去隔壁版块(Perl)闲逛了,发现有一个帖子还蛮不错,所以把它搬到这边来了,给各位练练手。
原帖链接:http://bbs.chinaunix.net/thread-4069184-1-1.html
基本的内容如下:
初始文本:
port trunk allow-pass vlan 1 3 to 19 21 to 25 27 29 32 to 35 37 to 41 43 to 44 48 52 to 56 59 to 64 66 to 70
目标文本:
port trunk allow-pass vlan 1
port trunk allow-pass vlan 3
port trunk allow-pass vlan 4
port trunk allow-pass vlan 5
……
port trunk allow-pass vlan 19
port trunk allow-pass vlan 21
……
port trunk allow-pass vlan 25
port trunk allow-pass vlan 27
port trunk allow-pass vlan 29
port trunk allow-pass vlan 32
……
port trunk allow-pass vlan 35
……
聪明的你应该可以从初始文本和目标文本看出转换的意图吧?
要求:最好能用一个命令(不借助管道)完成此题。
下面是我的方法,为了不影响各位的思路,我将我的方法先隐藏起来,大家可以先自己动动脑筋做一下。

游客,如果您要查看本帖隐藏内容请回复

论坛徽章:
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
2 [报告]
发表于 2013-02-28 10:39 |只看该作者
awk:
  1. awk '{head=$1" "$2" "$3" "$4;for(i=5;i<=NF;i++){if($i=="to"){f=1;continue;}else if(f){for(j=p;j<=$i;j++){print head,j;}f=0;}else{print head,$i;}p=$i+1;}}' urfile
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2013-02-28 10:49 |只看该作者
回复 2# blackold


    黑哥的思路不错,学习~

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
4 [报告]
发表于 2013-02-28 10:59 |只看该作者
这个以前有一个类似的题。还是跟上次思路一样,来个 sed 的:
  1. [seesea@UC ~]$ cat file
  2. port trunk allow-pass vlan 3 to 19 21 to 25 29 32 to 35 37 to 41 43 to 44 48 52 to 56 59 to 64 66 to 70
  3. [seesea@UC ~]$ cat num.sed
  4. s/([0-9]+) to ([0-9]+)/{\1..\2}/g
  5. s/^/echo /
  6. e

  7. :loop
  8.     s/([^0-9]*)( [0-9]+)( [0-9]+)/\1\2\n\1\3/
  9.     P
  10.     D
  11. tloop
  12. [seesea@UC ~]$ sed -rf num.sed file
  13. port trunk allow-pass vlan 3
  14. port trunk allow-pass vlan 4
  15. port trunk allow-pass vlan 5
  16. port trunk allow-pass vlan 6
  17. port trunk allow-pass vlan 7
  18. port trunk allow-pass vlan 8
  19. port trunk allow-pass vlan 9
  20. port trunk allow-pass vlan 10
  21. port trunk allow-pass vlan 11
  22. port trunk allow-pass vlan 12
  23. port trunk allow-pass vlan 13
  24. port trunk allow-pass vlan 14
  25. port trunk allow-pass vlan 15
  26. port trunk allow-pass vlan 16
  27. port trunk allow-pass vlan 17
  28. port trunk allow-pass vlan 18
  29. port trunk allow-pass vlan 19
  30. port trunk allow-pass vlan 21
  31. port trunk allow-pass vlan 22
  32. port trunk allow-pass vlan 23
  33. port trunk allow-pass vlan 24
  34. port trunk allow-pass vlan 25
  35. port trunk allow-pass vlan 29
  36. port trunk allow-pass vlan 32
  37. port trunk allow-pass vlan 33
  38. port trunk allow-pass vlan 34
  39. port trunk allow-pass vlan 35
  40. port trunk allow-pass vlan 37
  41. port trunk allow-pass vlan 38
  42. port trunk allow-pass vlan 39
  43. port trunk allow-pass vlan 40
  44. port trunk allow-pass vlan 41
  45. port trunk allow-pass vlan 43
  46. port trunk allow-pass vlan 44
  47. port trunk allow-pass vlan 48
  48. port trunk allow-pass vlan 52
  49. port trunk allow-pass vlan 53
  50. port trunk allow-pass vlan 54
  51. port trunk allow-pass vlan 55
  52. port trunk allow-pass vlan 56
  53. port trunk allow-pass vlan 59
  54. port trunk allow-pass vlan 60
  55. port trunk allow-pass vlan 61
  56. port trunk allow-pass vlan 62
  57. port trunk allow-pass vlan 63
  58. port trunk allow-pass vlan 64
  59. port trunk allow-pass vlan 66
  60. port trunk allow-pass vlan 67
  61. port trunk allow-pass vlan 68
  62. port trunk allow-pass vlan 69
  63. port trunk allow-pass vlan 70
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2013-02-28 11:08 |只看该作者
回复 4# seesea2517


    没想到sed也能做这种“算术题”,学习了~

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2013-02-28 11:24 |只看该作者
本帖最后由 yestreenstars 于 2013-02-28 11:33 编辑

回复 4# seesea2517


    我把你的改成了单行脚本:
  1. sed -r 's/([0-9]+) to ([0-9]+)/{\1..\2}/g;s/^/echo /e;s/([^0-9]*)( [0-9]+)( [0-9]+)/\1\2\n\1\3/;P;D'
复制代码
那个标签貌似没有意义吧~

论坛徽章:
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
7 [报告]
发表于 2013-02-28 11:37 |只看该作者
回复 4# seesea2517


    这个中间还调用了shell,不算

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
8 [报告]
发表于 2013-02-28 11:42 |只看该作者
回复 7# blackold


    这样啊……要用 sed 来写加法那是多么折磨人的事情,还是罢了罢了。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
9 [报告]
发表于 2013-02-28 11:45 |只看该作者
回复 6# yestreenstars


    咦,还真是呢。那第一个 s 的 g 选项就可以去掉了。

论坛徽章:
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
10 [报告]
发表于 2013-02-28 11:55 |只看该作者
本帖最后由 blackold 于 2013-02-28 12:28 编辑

perl 更加简洁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP