免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
41 [报告]
发表于 2011-06-28 22:21 |只看该作者
本帖最后由 yinyuemi 于 2011-06-29 09:37 编辑
我觉得这个很合理啊
sed '1,3p',第一行读入时,行号LN=1, 1,3的条件被触发,开始往外p,一直到第 ...
waker 发表于 2011-06-28 19:31



    呵呵,非常赞同老大的观点,NUMBER1,/ADDRESS/(NUMBER2), 中的NUMBER1是“欺软怕硬”型的,只管“开龙头放水”,不管“停水”,NUMBER2负责”关闸停水“的事,/ADRRESS/也管”关闸“的事,不过”权力有限”,只能管自己,管不了别人,就像老大举的最后的例子,“一删到底”了。


-----------------------

sed '1d;1,3p'第一行读入的时候行号LN=1,1d以后直接进入下循环,后面的1,3p根本就不处理,读入第二行LN=2,所以1,3的条件永远都不会触发了

老大,刚才有看了下,貌似这句话有点问题:
  1. seq 10 |sed -n '1d;1,3p'
  2. 2
  3. 3

  4. # 1,3p还是被触发的

  5. sed --version
  6. GNU sed version 4.1.5

复制代码
----------------

见45楼黑哥详解

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
42 [报告]
发表于 2011-06-29 00:08 |只看该作者
回复 39# waker


开关判断的标准不一样啊。
  1. $ seq 10 | sed -n '1d;1,3p'
  2. 2
  3. 3
  4. $ sed --version
  5. GNU sed version 4.1.5
  6. Copyright (C) 2003 Free Software Foundation, Inc.
复制代码
GUN sed 是判断 >=1 而老版本的sed是判断 ==1

论坛徽章:
0
43 [报告]
发表于 2011-06-29 08:52 |只看该作者
本帖最后由 li2002 于 2011-06-29 08:56 编辑

不知道楼上说的老版本就是非gnu版本?
如果是这样gnu sed也有新老版本之说?,我的版本GNU sed version 4.0.7,可以用0,2p这种格式,但结果和楼主的不同

  1. seq 6|sed  -e '1,2d' -e '1,2d'
  2. 3
  3. 4
  4. 5
  5. 6
  6. seq 10 | sed -n '1d;1,3p'
  7. 没有输出
  8. 判断的标准也是==1
复制代码

论坛徽章:
0
44 [报告]
发表于 2011-06-29 09:14 |只看该作者
顶下5楼
感觉还是关于range表达方式的 一种约定

论坛徽章:
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
45 [报告]
发表于 2011-06-29 09:20 |只看该作者
本帖最后由 blackold 于 2011-06-29 09:26 编辑

回复 41# yinyuemi


    waker 的话没有问题。他说的是"老款"的sed, 非gsed。

    不同的版本处理方式不同,有的合理,有的不合理。
  1. $ seq 10|sed -n '1d;1,3p'
  2. 2
  3. 3

  4. $ sed --version
  5. GNU sed version 4.1.5
复制代码
  1. -bash-3.00$ uname
  2. SunOS

  3. -bash-3.00$ seq 10|sed -n '1d;1,3p'
  4. -bash-3.00$ seq 10|sed -n '1d;2,3p'
  5. 2
  6. 3
复制代码

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


    多谢黑哥指点

论坛徽章:
0
47 [报告]
发表于 2011-06-29 10:03 |只看该作者
本帖最后由 南极雨 于 2011-06-29 10:07 编辑

晕,看了好几天...

郁闷...

ss,黑哥解释的很到位,我来总结一下,欢迎尽情地拍砖了!!希望你动作优雅一点,

d 命令删除模式空间 ( d      Delete pattern space.  Start next cycle.cycle循环的意思,)Delete pattern space 啥意思啊?只要有模式空间就删除?!!!我觉得是这么个意思    看下面几个例子:
[root@center www.rmgnetworks.com]# seq 6 | sed -n -e '1,2p' -e '1,2p'
1
1
2
2
p 打印当前模式空间的内容(p      Print the current pattern space.)....这个不用解释,只是相对d而言的,这里我用了 " -n " 是为了不打印3行以后的东西.
[root@center www.rmgnetworks.com]# seq 6 | sed -n -e '1,2d' -e '1,2p'
3
这里p命令发挥的淋漓尽致了... 执行第二个-e的时候,读如第三行,1,2不匹配,但模式空间里有内容啊,总得显示出来吧.? (到这儿你要拍砖我也认了...)不只是p命令,其他的也一样.接着往下看:
[root@center www.rmgnetworks.com]# seq 6 | sed  -e '1,2d' -e '1,2p'
3
3
4
5
6
所以,只要模式空间里有内容, p 就会打印出来.
[root@center www.rmgnetworks.com]# seq 6 | sed  -e '1,2d' -e '1,2d'
4
5
6
同理,d也是一样,只要模式空间里有了,就会删除.

然后再来看看这个,做个比较:
[root@center www.rmgnetworks.com]# seq 6 | sed  -e '1,2d' -e '1,3d'
4
5
6

论坛徽章:
0
48 [报告]
发表于 2011-06-29 10:10 |只看该作者
我当时给其他人讲解 sed -e 然后随手举了个例子,然后尴尬了。。。。。。。。。。
解释不了,所以有此贴了。。。。。。。
好好研究下

论坛徽章:
0
49 [报告]
发表于 2011-06-29 10:24 |只看该作者
本帖最后由 where27 于 2011-06-29 10:36 编辑

回复 47# 南极雨


    你还真理解错了。。模式空间有内容也未必一定会打印出来,-n参数的作用就是关闭自动打印模式空间的内容
  1. -n, --quiet, --silent

  2.               suppress automatic printing of pattern space
复制代码
  1. #seq 6 | sed -n -e '1,2d' -e '1,2p'
  2. 3
复制代码
这命令之所以会打印3,不是因为模式空间里有3,导致自动打印,而是因为第二段 -e '1,2p' 匹配了模式空间的3(也就是第三行)才打印(p)的,至于为什么会匹配第三行,前面yinyuemi和黑哥已经讲的很清楚了,你再仔细看看吧。
同理,d也是一样,不是模式空间有就会删除,根本原因是匹配了range

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
50 [报告]
发表于 2011-06-29 11:00 |只看该作者
回复 43# li2002


哦,原来GNU sed不同版本的处理方式也有区别,这个以前还真没注意到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP