免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Nalternative
打印 上一主题 下一主题

【5楼解答的很详细,大家可以讨论下】sed 地址和模式匹配的问题 [复制链接]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
11 [报告]
发表于 2011-06-26 02:05 |只看该作者
回复 10# xrzs1986


当上一个-experssion执行结束的时候,开始下个循环,从头执行,而恰巧这个例子的第一个experssion把1,2行删除了,所以第二个experssion实际上是从第三行开始的,但行号没有变,也就是为什么和lz给的第二个代码执行不同的原因,

而读入第三行时,第二个“1,2”中的1 会和<a>中0那样,"try to match regexp in the first input line too",也就是这里的第三行,所以执行d,删除第三行。

论坛徽章:
0
12 [报告]
发表于 2011-06-26 02:33 |只看该作者
本帖最后由 lionfun 于 2011-06-26 02:36 编辑

回复 5# yinyuemi


    “读入第三行,1,2匹配成功了一半,因为1匹配成功”:“1,2”怎么与第三行匹配成功一半!!!这个我有点困惑,脑子反应不过来了,求ss兄再详细指点,谢谢!

哦,尽然有人先问了!!!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
13 [报告]
发表于 2011-06-26 02:59 |只看该作者
回复 12# lionfun



在sed中,对于line1,line2(或line1,/pattern/)这样的模式,如果pattern空间的行号,大于等于line1的话,判断为真,小于line1时,判断为假。
而line2则正好相反。

论坛徽章:
0
14 [报告]
发表于 2011-06-26 03:03 |只看该作者
回复 11# yinyuemi


    我用sedsed调试了下:
  1. [root@station3 ~]# cat a.txt
  2. aaaa
  3. bbbb
  4. cccc
  5. dddd
  6. [root@station3 ~]#
  7. [root@station3 ~]# sedsed -d -e '=;1,2d' -e '=;1,2d' a.txt
  8. PATT:aaaa$
  9. HOLD:$
  10. COMM:=
  11. 1
  12. PATT:aaaa$
  13. HOLD:$
  14. COMM:1,2 d
  15. PATT:bbbb$
  16. HOLD:$
  17. COMM:=
  18. 2
  19. PATT:bbbb$
  20. HOLD:$
  21. COMM:1,2 d
  22. PATT:cccc$
  23. HOLD:$
  24. COMM:=
  25. 3
  26. PATT:cccc$
  27. HOLD:$
  28. COMM:1,2 d
  29. PATT:cccc$
  30. HOLD:$
  31. COMM:=
  32. 3 #这里行号为3,然后通过下面的1,2d,尽然还能删除?这个又怎么理解?
  33. PATT:cccc$
  34. HOLD:$
  35. COMM:1,2 d
  36. PATT:dddd$
  37. HOLD:$
  38. COMM:=
  39. 4
  40. PATT:dddd$
  41. HOLD:$
  42. COMM:1,2 d
  43. PATT:dddd$
  44. HOLD:$
  45. COMM:=
  46. 4
  47. PATT:dddd$
  48. HOLD:$
  49. COMM:1,2 d
  50. PATT:dddd$
  51. HOLD:$
  52. dddd
复制代码

论坛徽章:
0
15 [报告]
发表于 2011-06-26 03:13 |只看该作者
本帖最后由 lionfun 于 2011-06-26 03:20 编辑

回复 13# yinyuemi


    按你的理解的话,结合我上面的调试,我更加疑惑了:处理到cccc这一行了,显示行号为3,然后进入1,2d;3>1返回真,3>2返回假,最终1,2匹配不了cccc这一行啊,但是怎么就删除了,如果第3行都匹配了到了第4行也应该匹配啊,照这样下去……

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
16 [报告]
发表于 2011-06-26 05:28 |只看该作者
本帖最后由 yinyuemi 于 2011-06-26 05:40 编辑

回复 15# lionfun


    /pattern1/,/pattern/或是line1,line2
匹配的过程是:
pattern1或line1匹配成功,就执行之后的action,而不需要判断是否pattern2或line2匹配成功。
之后,pattern2或line2负责action什么时候结束,

以你的例子来讲,第三行第一次读入模式空间的时候,第一个1,2d中的2判断失败,所以d不执行,也不做其它action,直接进入下一个循环。
这时第三行第二次读入模式空间,这次第二个1,2d中的1判断成功,执行d,删除ccc,
接着第四行读入模式空间,第二个1,2d中的2判断失败,不执行d,也不做其他action,直接进入下一个循环,
第四行,第二次读入模式空间,因为没有-n选项,所以默认打印输出。

论坛徽章:
0
17 [报告]
发表于 2011-06-26 10:49 |只看该作者
回复 16# yinyuemi
这个题应该放到上次那个shell大赛中。。。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
18 [报告]
发表于 2011-06-26 11:05 |只看该作者
回复 17# xiaopan3322


   

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
19 [报告]
发表于 2011-06-26 12:41 |只看该作者
sed一行一行地处理数据

论坛徽章:
0
20 [报告]
发表于 2011-06-26 12:44 |只看该作者
回复 16# yinyuemi


    我先mark下!!这个问题我觉得很难!但是非常感谢ss兄的解答!(ps:ss兄,你太有精力了,24小时不睡?)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP