免费注册 查看新帖 |

Chinaunix

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

请教sed "D"操作问题. [复制链接]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
41 [报告]
发表于 2008-07-14 21:32 |只看该作者
原帖由 mystérieux 于 2008-7-14 21:17 发表
ly5066113 说:“如果没有条件限制,它会删光模式空间。”看看下面这个删光没有?
# seq 5 | sed ':1;1,5{N;b1};D'
1
2
3
4
5

N
    Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then sed exits without processing any more commands.

论坛徽章:
0
42 [报告]
发表于 2008-07-14 21:35 |只看该作者
把02、03年的前辈都请出来了,高兴,我出门消遣消遣,你们继续聊,一会儿回来看猫头鹰有何话说。

论坛徽章:
0
43 [报告]
发表于 2008-07-14 21:35 |只看该作者
seq  5|./sedsed -d -e ':1;1,5{N;b1};D'
PATT:1$
HOLD
COMM::1
COMM:1,5 {
COMM:N
PATT:1\n2$
HOLD
COMM:b 1
COMM:1,5 {
COMM:N
PATT:1\n2\n3$
HOLD
COMM:b 1
COMM:1,5 {
COMM:N
PATT:1\n2\n3\n4$
HOLD
COMM:b 1
COMM:1,5 {
COMM:N
PATT:1\n2\n3\n4\n5$
HOLD
COMM:b 1
COMM:1,5 {
COMM:N
1
2
3
4
5
空行

这里这里并没有执行D 你应该知道为什么

论坛徽章:
0
44 [报告]
发表于 2008-07-14 21:36 |只看该作者
想不到r2007在41楼已经贴出了

论坛徽章:
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 [报告]
发表于 2008-07-14 21:39 |只看该作者
原帖由 mystérieux 于 2008-7-14 21:29 发表


那你对32楼的那个例子怎么解释?

seq 5 | sed ':1;1,5{N;b1};D'
因为读到第五行,即最后行一时,你还N,这导致输出Pattern Space空间的内容,并立即结束整个脚本,D并没有机会执行。所以结果就像你看到的那样。

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
46 [报告]
发表于 2008-07-14 21:43 |只看该作者
so,一般要相信man,当然不排除bug。建议一字一字的品读一下man,并非一定要靠教程,man加实践练习,更助于理解。

论坛徽章:
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
47 [报告]
发表于 2008-07-14 21:45 |只看该作者
原帖由 r2007 于 2008-7-14 21:43 发表
so,一般要相信man,当然不排除bug。建议一字一字的品读一下man,并非一定要靠教程,man加实践练习,更助于理解。


至理!

man是最好的教程!

论坛徽章:
0
48 [报告]
发表于 2008-07-15 00:01 |只看该作者
原帖由 blackold 于 2008-7-14 21:39 发表

seq 5 | sed ':1;1,5{N;b1};D'
因为读到第五行,即最后行一时,你还N,这导致输出Pattern Space空间的内容,并立即结束整个脚本,D并没有机会执行。所以结果就像你看到的那样。


不同意! D不是没有机会执行,而不是知道该怎么执行,因为这是一个特殊情况,通过:1;1,5{N;b1};这种方式使这五行都连成一个多行模式,从整体来说,这是一个单行模式,这个单行模式里面包含了一个五行的多行模式,因为情况特殊,D不知道该怎么执行,因此没有动静。
我仍然坚持我在2楼的理解,只不过我错的是忽略了楼主那个结构,它是读两行后马上就D,而不是累加起来而后D,因为我最近在琢磨:1;1,5{N;b1};,脑袋里总想它,受了影响,经过li2002的提醒,我知道我的错误所在,但从下面这种情形下的理解是没错的:把许多行用N连成多行模式,当用D删除的时候,1\n2\n3\n4\n5 ,D会删到最后一个\n为止,这可以从可可熊的那个例子得到证明,它会剩下最后那个,而不是像ly兄所说的,删得精光,我的理解还可以用此来证明:
#  seq 10 | sed ':1;1,5{N;b1};N;D'
5
6
7
8
9
10
这种情况就是两个大行组成的多行模式,而这两个大行中又包含了五行组成的多行模式,D见到这种情况,就知道该怎么作了,照例,他删除了前一个1\n2\n3\n4\n5 ,保留了后面的\n6\n7\n8\n9\n10,而在这个前面的模式当中,他又是照例留下了5。

论坛徽章:
0
49 [报告]
发表于 2008-07-15 00:08 |只看该作者
看到这么多回复实在是感动啊..
后来下载了sed & awk , 在仔细琢磨了一番,终于明白了,关键在于"skip reading from the input ",这个不同与单行模式,就等于匹配模式如果还有内容,就不直接到下一行.
正如3楼所解释的!

论坛徽章:
0
50 [报告]
发表于 2008-07-15 00:09 |只看该作者
原帖由 r2007 于 2008-7-14 21:32 发表

N
    Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then sed exits without processing any more commands.


可惜括号里的管不了外面的,呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP