BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


请教sed "D"操作问题.
首页 » 论坛 » Shell »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
meeslo   帅哥
骑士




UID:465971
注册:2006-9-15
最后登录: 2008-10-05
帖子:64
精华:0

可用积分:84 (白手起家)
信誉积分:105
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2008-7-14 01:23 
举个例子:
类似显示最后两行
tail -2

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" 这个不明白怎么解释.

seq 5|sed '$!N;$!D'

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



您对本贴的看法:鲜花[0] 臭蛋[1]

__________________________________

http://www.cygwin.net.cn/ CYGWIN镜像

http://www.xshell.com.cn/
XSHELL
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
mystérieux   美女
精灵



UID:587169
注册:2007-7-14
最后登录: 2008-09-22
帖子:154
精华:0

可用积分:189 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2008-7-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 编辑 ]



您对本贴的看法:鲜花[1] 臭蛋[2]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
li2002
精灵使



UID:6382
注册:2002-4-5
最后登录: 2008-10-16
帖子:3705
精华:10

可用积分:2713 (小富即安)
信誉积分:100
专家积分:21 (本版:20)
空间积分:825
推广积分:0

来自:江苏
状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2008-7-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,最后输出最后两行



您对本贴的看法:鲜花[1] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
blackold   帅哥 (黑哥)
大天使



UID:631768
注册:2007-10-22
最后登录: 2008-10-15
帖子:2118
精华:0

可用积分:4400 (小富即安)
信誉积分:0
专家积分:91 (本版:91)
空间积分:0
推广积分:0

来自:北海
状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2008-7-14 09:08 
回复 #3 li2002 的帖子

正解!



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
可可熊
光明使者




UID:498669
注册:2006-12-1
最后登录: 2008-09-28
帖子:814
精华:0

可用积分:4681 (小富即安)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:西安
状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-7-14 10:17 
回复 #3 li2002 的帖子

学习了。



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
edei2004   帅哥 (tao)
圣骑士



UID:604603
注册:2007-8-18
最后登录: 2008-09-08
帖子:104
精华:0

可用积分:146 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2008-7-14 10:36 
嗯,  li2002  说得比较直观



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Shell_HAT
光明使者




UID:637535
注册:2007-11-5
最后登录: 2008-10-12
帖子:912
精华:0

可用积分:829 (稍有积蓄)
信誉积分:0
专家积分:5 (本版:5)
空间积分:860
推广积分:0

来自:重庆
状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2008-7-14 11:14 
D操作删除第一个换行之后,如果模式空间非空,则跳转到命令的开头继续读下一行。
第一行 1 读入变成 1\n2, D操作,模式空间变成2,非空,跳转到命令的开头继续读下一行
第三行 3 读入变成 2\n3, 而不是你认为的3\n4



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
mystérieux   美女
精灵



UID:587169
注册:2007-7-14
最后登录: 2008-09-22
帖子:154
精华:0

可用积分:189 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


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

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



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
blackold   帅哥 (黑哥)
大天使



UID:631768
注册:2007-10-22
最后登录: 2008-10-15
帖子:2118
精华:0

可用积分:4400 (小富即安)
信誉积分:0
专家积分:91 (本版:91)
空间积分:0
推广积分:0

来自:北海
状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-7-14 12:41 
回复 #8 mystérieux 的帖子

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



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

LIVE FREE OR DIE!     K.I.S.S.


积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
mystérieux   美女
精灵



UID:587169
注册:2007-7-14
最后登录: 2008-09-22
帖子:154
精华:0

可用积分:189 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-7-14 12:48 
第一,据我的资料上说,D只有权力对多行模式进行删除。
第二,按照上面各位的理论,D只能删除前面的部分,那么就算不顾最后一行小五的苦苦哀求,越权行事,怎么也应该把小四儿留下吧。



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

首页 » 论坛 » Shell »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.118769 second(s), 4 queries , Gzip enabled