免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chengchow

[文本处理] 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
发表于 2014-08-28 11:06 |显示全部楼层
回复 20# chengchow

语文学得不错,采用了夸张的修辞手法~
   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2014-08-28 11:17 |显示全部楼层
回复 20# chengchow

++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<>>>>>>>>>>>>+++.---<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>--.++<<<<<<>>>>>>>>>>>>>.<<<<<<<<<<<<<>>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<.
   

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2014-08-28 11:21 |显示全部楼层
fuck brand 不明觉历呀!!!!!!!!

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
发表于 2014-08-28 11:51 |显示全部楼层
回复 22# jason680
不明觉厉,古巴比伦文?


   

论坛徽章:
3
金牛座
日期:2013-08-26 10:25:02摩羯座
日期:2013-09-09 15:14:322015年亚洲杯之约旦
日期:2015-05-06 09:33:56
发表于 2014-08-28 12:09 |显示全部楼层
我是来围观大神的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2014-08-28 13:47 |显示全部楼层
chengchow 发表于 2014-08-28 11:04
回复 19# yestreenstars

再次鄙视下星辰大婶,占了沙发和N层楼,居然什么活都没干!

可是偶还是怀疑,你未必明白了我那个程序在干吗.......

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
发表于 2014-08-28 14:06 |显示全部楼层
本帖最后由 chengchow 于 2014-08-28 15:00 编辑

回复 26# cjaizss
确实没看懂,慢慢看了!单独看差多懂,还是没搞懂版主思路(这个很糟糕),麻烦解释了
是通过sed分支循环累加来实现的吗?(猜测)
#!/bin/sed -nrf
s/[^ \t]+/1/g      ##替换字段字符为1
#s/[ \t]+/ /g       ##规范格式
#s/^ | $//g         ## 规范格式
#/^$/ {p;d;}      ## 规范格式
s/1/1;/                ## 替换1为1;执行完因该是“1; 1; 1; 1;”
ta;                      ## 分支执行条件满足跳到:a
:a;                      ## ta标记
s/([0-9]+); 1( |$)/\1 \1;\2/    ##单独看,不明白这句效果,执行到这里似乎没有匹配上/([0-9]+); 1( |$)/的字符串
tc;                       ## 同ta
s/;//                    ## 删除;
p                         ## 打印
:c                        ##  tc标记
/0;/{s//1;/;ta;}    ##匹配0;任意字符为1;执行并跳转:a   
s/;/-;/                  ##替换;为-;
:b;                       ##tb表记
s/9-/-0/                ##替换9-为-0
tb                         ##同ta
s/0-/1/;ta;            ##替换0-为1,并跳转:a
s/1-/2/;ta;            ##以下同上
s/2-/3/;ta;
s/3-/4/;ta;
s/4-/5/;ta;
s/5-/6/;ta;
s/6-/7/;ta;
s/7-/8/;ta;
s/8-/9/;ta;
s/-/1/;ta;


   

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2014-08-28 16:24 |显示全部楼层
本帖最后由 cjaizss 于 2014-08-28 16:25 编辑
chengchow 发表于 2014-08-28 14:06
回复 26# cjaizss
确实没看懂,慢慢看了!单独看差多懂,还是没搞懂版主思路(这个很糟糕),麻烦解释了
...

思路,先把各字段替换为1,开头无空格,结尾无空格,每两个1用单个空格隔开.
然后挨个字段+1依次替换过去.
替换完了,输出.
比如,有10个字段,先替换为
1 1 1 1 1 1 1 1 1 1
然后
1 2 1 1 1 1 1 1 1 1
1 2 3 1 1 1 1 1 1 1
1 2 3 4 1 1 1 1 1 1
1 2 3 4 5 1 1 1 1 1
1 2 3 4 5 6 1 1 1 1
1 2 3 4 5 6 7 1 1 1
1 2 3 4 5 6 7 8 1 1
1 2 3 4 5 6 7 8 9 1
1 2 3 4 5 6 7 8 9 10
输出.

  1. #!/bin/sed -nrf
  2. s/[^ \t]+/1/g
  3. s/[ \t]+/ /g
  4. s/^ | $//g
  5. #以上三句先把各字段替换为1,开头无空格,结尾无空格,每两个1用单个空格隔开.

  6. #如果本行没有字段,直接空行输出
  7. /^$/ {p;d;}

  8. #先把第一个1后面加个分号,以后每处理一个字段,往后移一下,以分号标记处理到第几个段
  9. s/1/1;/
  10. ta; #这里之所以要用t,在于清除掉之前s成功

  11. :a;
  12. #这里就是把分号往后移动一个字段,以标志处理下一个字段,并把之前处理过的值复制过去,再来做当前字段+1
  13. #例:
  14. #当前处理为
  15. #1 2 3; 1 1 1
  16. #移动之后,为
  17. # 1 2 3 3; 1 1
  18. s/([0-9]+); 1( |$)/\1 \1;\2/
  19. tc;
  20. #tc失败发生在处理完所有的字段,也就是说分号后面已经不存在1了,那么就把分号干掉,并输出
  21. s/;//
  22. p
  23. #这里本来应该加个d,不过我就没加了,因为此时已经没有分号,后面统统都会不成立


  24. #这里就是+1的技巧了,技巧其实不难,看末尾的数字,如果是0-8很简单
  25. #但如果是9,那么就把最后的几个9都变0,前面再+1
  26. #使用一个短横线作为处理的标志
  27. :c
  28. /0;/{s//1;/;ta;}
  29. s/;/-;/
  30. :b;
  31. s/9-/-0/
  32. tb

  33. s/0-/1/;ta;
  34. s/1-/2/;ta;
  35. s/2-/3/;ta;
  36. s/3-/4/;ta;
  37. s/4-/5/;ta;
  38. s/5-/6/;ta;
  39. s/6-/7/;ta;
  40. s/7-/8/;ta;
  41. s/8-/9/;ta;
  42. s/-/1/;ta;
复制代码
另外,调试sed可以用sedsed,看起来比较方便,不过我从来不用这玩意,调试都是裸调的

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
发表于 2014-08-28 16:45 |显示全部楼层
回复 28# cjaizss
非常感谢,明白了!
s/1/1;/                ## 替换1为1;执行完因该是“1; 1; 1; 1;”
理解错了,没有全文替换,粗心了,后面对不上了
解释后现在再看,就清楚多了

   

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
发表于 2014-08-29 17:59 |显示全部楼层
都是大牛~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP