免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2008-07-14 19:36 |只看该作者
下面这个例子与楼主的同出一辙,数目多点,看得更明显:
# seq 10 | sed ':1;1,5{N;b1};6!D'
1
2
3
4
5
6
# seq 10 | sed ':1;1,5{N;b1};7!D'
7
# seq 10 | sed ':1;1,5{N;b1};8!D'
8

论坛徽章:
0
22 [报告]
发表于 2008-07-14 19:39 |只看该作者
原帖由 可可熊 于 2008-7-14 17:03 发表
[cocobear@cocobear test]$ seq 5|sed 'N;D'
5

自己做做试验,体会体会。

怪了,你这个怎么没删干净?

论坛徽章:
0
23 [报告]
发表于 2008-07-14 19:47 |只看该作者
由此看来,我前面说的也没错,D的两个特性
1.循环 - cycle
2.跳跃 - skip (仅对多行模式而言)

如果一个多行模式删到了最后一行,没有后面的东西可删,这一行无论如何也删不掉。

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

论坛徽章:
0
24 [报告]
发表于 2008-07-14 19:52 |只看该作者
感谢可可熊的这个例子!这回猫头鹰被我抓了。哈哈

论坛徽章:
0
25 [报告]
发表于 2008-07-14 20:09 |只看该作者
我13楼所说的稍微改一下,多行后面必须有可删的东西(即非多行模式),它才能完成循环删除,我想这是skip的含义。

[ 本帖最后由 mystérieux 于 2008-7-15 00:28 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2008-07-14 20:25 |只看该作者
不对,还是不太对,但已经越来越接近真理了。

论坛徽章:
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
27 [报告]
发表于 2008-07-14 20:56 |只看该作者
原帖由 mystérieux 于 2008-7-14 20:25 发表
不对,还是不太对,但已经越来越接近真理了。

“不太对”?

论坛徽章:
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
28 [报告]
发表于 2008-07-14 20:58 |只看该作者
原帖由 mystérieux 于 2008-7-14 13:13 发表
ly5066113 ,你说的不对啊

ly5066113  说的没有错。

论坛徽章:
0
29 [报告]
发表于 2008-07-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工具好好看看每步执行的结果就知道D没你想得那么复杂


seq 10|./sedsed -d -e ':1;1,5{N;b1};7!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
PATT:1\n2\n3\n4\n5\n6$
HOLD
COMM:b 1
COMM:1,5 {
COMM:7 !D
PATT:2\n3\n4\n5\n6$
HOLD
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:3\n4\n5\n6$
HOLD
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:4\n5\n6$
HOLD
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:5\n6$
HOLD
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:6$
HOLD:$
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:7$
HOLD:$
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:7$
HOLD:$
7            《-----------------这里显示了7
PATT:8$
HOLD:$
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:9$
HOLD:$
COMM::1
COMM:1,5 {
COMM:7 !D
PATT:10$
HOLD:$
COMM::1
COMM:1,5 {
COMM:7 !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.
这句话的意思,事实确实如此

论坛徽章:
0
30 [报告]
发表于 2008-07-14 21:14 |只看该作者
原帖由 blackold 于 2008-7-14 20:58 发表

ly5066113  说的没有错。


# seq 5 | sed ':1;1,5{N;b1};D'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP