免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2008-07-15 00:12 |只看该作者
不知道你们所说的循环和略过是什么?

我理解的是

1、sed是一系列命令的堆集,是从前到后顺序执行的,当执行到命令序列的最后的时候,会读取新的内容,并从头开始执行命令序列。
2、当模式空间中有内容的时候,sed是不读入新的内容的,但是仍然从头开始执行命令序列。
3、D是删除模式空间中从开头到第一个出现的换行符之间的内容(包括换行符),同时略过D后面的所有命令序列(实际上就是跳到命令序列的最后),如果模式空间中没有换行符,那么它的作用与d相同,就是删除当前模式空间的内容

比如:
sed '.....;D;s/1/2/'  这个表达式中,s/1/2/永远不会执行,因为它在D后面。

[ 本帖最后由 springwind426 于 2008-7-15 00:14 编辑 ]

论坛徽章:
0
52 [报告]
发表于 2008-07-15 00:12 |只看该作者
来迟一步,貌似还在继续。
坐下来慢慢看一遍。
o(∩_∩)o...

论坛徽章:
0
53 [报告]
发表于 2008-07-15 00:14 |只看该作者
原帖由 springwind426 于 2008-7-15 00:12 发表
不知道你们所说的循环和略过是什么?

我理解的是

1、sed是一系列命令的堆集,是从前到后顺序执行的,当执行到命令序列的最后的时候,会读取新的内容,并从头开始执行命令序列。
2、当模式空间中有内容的 ...


我不同意您的第三条:“D是删除模式空间中从开头到第一个出现的换行符之间的内容”

论坛徽章:
0
54 [报告]
发表于 2008-07-15 00:22 |只看该作者
四位前辈 li2002 ly5066113  blackold springwind426
承让,以后还要向各位多讨教。

论坛徽章:
0
55 [报告]
发表于 2008-07-15 00:24 |只看该作者
对不起,落了一位前辈,r2007 ,应该是五位

论坛徽章:
0
56 [报告]
发表于 2008-07-15 00:26 |只看该作者

回复 #21 mystérieux 的帖子

  1. # seq 10 | sed ':1;1,5{N;b1};7!D'
  2. 7
复制代码



这个是因为:到第七行是6时是
1\n2\n3\n4\n5\n6
然后因为不是第七行,所以就D,
这时候剩下
2\n3\n4\n5\n6
以为模式空间还有以上的内容,同事也不是第七行,所以就继续D
3\n4\n5\n6
.....
直到被删除光了才跳到第七行.

论坛徽章:
0
57 [报告]
发表于 2008-07-15 00:31 |只看该作者
原帖由 li2002 于 2008-7-14 21:01 发表
不要想得太复杂了,其实D很简单的,你的那个
sed  ':1;1,5{N;b1};7!D'   等价于
sed -n ':1;1,5{N;b1};7!D;p'

由于7行不D,不自动从头循环,所以执行了p,显示了7

你用r2007说的sedsed工具好好看看每步执 ...


看来我是理解对了..还是经过一番讨论后,渐渐就清晰起来了.

论坛徽章:
0
58 [报告]
发表于 2008-07-15 00:34 |只看该作者
这里有一段对D的解释
函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下:   

    [address1,address2]D


对上述格式有下面几点说明 :   

函数参数 D 最多配合两个位址参数。  
函数参数 D 与 d 的比较如下 :  
当 pattern space 内只有一资料行时 , D 与 d 作用相同。  
当 pattern space 内有多行资料行时  
D 表示只删除 pattern space 内第一行资料 ; d 则全删除。  
D 表示执行删除後 , pattern space 内不添加下一笔资料 , 而将剩下的资料重新执行 sed script ; d 则读入下一行後执行 sed script。


关键就在于 "D 表示执行删除後 , pattern space 内不添加下一笔资料 , 而将剩下的资料重新执行 sed script ; d 则读入下一行後执行 sed script。" 这句话..呵呵

[ 本帖最后由 meeslo 于 2008-7-15 00:35 编辑 ]

论坛徽章:
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
59 [报告]
发表于 2008-07-15 00:51 |只看该作者
原帖由 springwind426 于 2008-7-15 00:12 发表
不知道你们所说的循环和略过是什么?

我理解的是

1、sed是一系列命令的堆集,是从前到后顺序执行的,当执行到命令序列的最后的时候,会读取新的内容,并从头开始执行命令序列。
2、当模式空间中有内容的 ...

仅认同第一句话。

论坛徽章:
0
60 [报告]
发表于 2008-07-15 00:59 |只看该作者
原帖由 li2002 于 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,因是最 ...


至于skip,li2002兄的解释恐怕也不对,按楼主引用的原文:
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.

这个skip不是发生在前面,而是先删到多行中的最后一个\n,然后这个skip才发生,它会跳过多行模式中剩下的最后那个,查看下面的一行是否可删,如果可删,就删除该行,然后再删除多行的遗留行,如果不可删或者没有行了,就停止。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP