免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-14 01:23 |只看该作者 |倒序浏览
举个例子:
类似显示最后两行
tail -2
  1. seq 5|sed '$!N;$!D'
复制代码


D
Delete  up to the first embedded newline in the pattern space.  Start next cycle, but skip reading from the input if there is still data in  the pattern space.

这个应该如何解释比较澳合理?
"but skip reading from the input" 这个不明白怎么解释.

  1. seq 5|sed '$!N;$!D'
复制代码

不是最后一行就"N" 读取下一行追加到当前行,不是最后一行就"D"删除模式空间里面的第一个换行前的内容.
第一行 1 读入变成 1\n2, D操作是否变成2?
第三行 3 读入变成 3\n4, D操作后是否变成4?
如果是这样,那结果就变成
2
4
5
肯定是不对了.
想了N久实在没想明白,:em11:

论坛徽章:
0
2 [报告]
发表于 2008-07-14 05:53 |只看该作者
meeslo 提的这个问题相当有意思,我也琢磨了一下,您上面对D的理解有误,当用N的时候,等于说,原来的模式空间是(我们简单表示):
-----
-----
-----
-----
-----
因为用了N,所以当一行一行地读取输入数据的时候,模式空间可能会变成这个样子:

-----\n-----\n-----\n-----\n----- 多行模式

-----   非多行模式

即,模式空间由多行模式加上非多行模式组成,而多行模式中最后一个\n是关键,因为它是最后一次被追加上的,于是,它成了分开旧的多行模式(前四段-----)与最新的一条多行模式内容之间的分隔符,这也是D的作用所在,它所删除的正是这个"\n"前面的所有内容,就像您上面引述的:Delete  up to the first embedded newline in the pattern space. 既然是up to 而不是down to,说明这个first是从后往前算的,而删除行为却只能是从头往 后来,呵呵,它这论述用的first容易引起迷惑,其实教程都有表述不统一的地方,参考另外一个教程(那里管前面部分叫first),对照一下就比较清楚了:
http://www.unix.com.ua/orelly/unix/sedawk/ch06_01.htm
因此删到图中的最后一个\n(也就是英文说明中所说的first embedded newline)为止。
所以,seq 5|sed '$!N;$!D'
模式空间中多行的部分:
1\n2\n3\n4
D在删除的时候,以3和4之间的\n为分水岭,把前面的删干净,只留下后面的4。
至于那个skip,我还不太明白。

[ 本帖最后由 mystérieux 于 2008-7-14 05:58 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-07-14 06:25 |只看该作者
首先读入第一行1,然后N读入2,pattern space里面是1\n2,D后pattern space变成2,然后skip  skip reading from the input ,再碰到N读入3,pattern space里面是2\n3,D后pattern space变成3。。。N后读入5,因是最后一行不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
4 [报告]
发表于 2008-07-14 09:08 |只看该作者

回复 #3 li2002 的帖子

正解!

论坛徽章:
0
5 [报告]
发表于 2008-07-14 10:17 |只看该作者

回复 #3 li2002 的帖子

学习了。

论坛徽章:
0
6 [报告]
发表于 2008-07-14 10:36 |只看该作者
嗯,  li2002  说得比较直观

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
7 [报告]
发表于 2008-07-14 11:14 |只看该作者
D操作删除第一个换行之后,如果模式空间非空,则跳转到命令的开头继续读下一行。
第一行 1 读入变成 1\n2, D操作,模式空间变成2,非空,跳转到命令的开头继续读下一行
第三行 3 读入变成 2\n3, 而不是你认为的3\n4

论坛徽章:
0
8 [报告]
发表于 2008-07-14 12:32 |只看该作者
明白了。
可你们的理论也无法解释下面这个,它什么输出也没有,这怎么回事? 照各位的说法,怎么也应该留一两个呀。
# seq 5|sed '$!N;D'

[ 本帖最后由 mystérieux 于 2008-7-14 12:36 编辑 ]

论坛徽章:
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
9 [报告]
发表于 2008-07-14 12:41 |只看该作者

回复 #8 mystérieux 的帖子

因为它总是D,无论是$!还是$。

论坛徽章:
0
10 [报告]
发表于 2008-07-14 12:48 |只看该作者
第一,据我的资料上说,D只有权力对多行模式进行删除。
第二,按照上面各位的理论,D只能删除前面的部分,那么就算不顾最后一行小五的苦苦哀求,越权行事,怎么也应该把小四儿留下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP