免费注册 查看新帖 |

Chinaunix

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

请问sed的P命令和D命令的用法  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-10 10:14 |只看该作者 |倒序浏览
sed大写的P命令和D命令的用法我不明白。看了man,上面写:
D          Deletes the initial segment of the pattern space through the first  newline and starts the next cycle.
P          Prints (copies) the initial segment of the pattern space through the  first        newline        to the standard        output.
但是里面那句through the first  newline 看不懂,是什么意思?newline指的是什么?还有initial segment 指的又是什么?谁能结合一些例子讲解一下?

论坛徽章:
0
2 [报告]
发表于 2004-03-18 17:30 |只看该作者

请问sed的P命令和D命令的用法

这帖子沉到底了。顶上来。
请sed达人就以下例子为我解释一下:
6.按关键字拼接行
如果某行以=开始,则合并到上一行并替代=为空格

代码:
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

举例
代码:
cat file
111111111111111111
222222222222222222
=333333333333333333
444444444444444444

sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' filename
111111111111111111
222222222222222222 333333333333333333
444444444444444444

如果不加-e'P;D',那么后面的以“=”号开头的行都不会合并上来,可是我不理解-e'P;D'的意思,请高手解释一下。

论坛徽章:
0
3 [报告]
发表于 2004-03-18 17:40 |只看该作者

请问sed的P命令和D命令的用法

见ad版主的sed学习日记:
http://bbs.chinaunix.net/forum/viewtopic.php?t=166936&highlight=admirer

论坛徽章:
0
4 [报告]
发表于 2004-03-18 18:11 |只看该作者

请问sed的P命令和D命令的用法

我这个例子就是从那篇帖子里面抄的呀,但是这个例子还是没有看懂。能不能结合这个例子解释一下?

论坛徽章:
0
5 [报告]
发表于 2004-03-18 18:55 |只看该作者

请问sed的P命令和D命令的用法

我来试着解释一下,如有不妥,请见谅。
-e :a 定义一个标签位置
$!N   如果不是最后一行,就读入新行附加于pattern space之后,以“\n”分隔
s/\n=/ /  如果发现了新行是以=开头的,替换为空格
ta      如果找到了替换,从标签a处再执行,否则向下走
P     打印 pattern space中的第一个 \n之前的内容
D     删除pattern space中的第一个 \n之前的内容,并返回脚本头部执行
各个命令解释清楚了,再看执行过程:
第一行执行,没有找到 \n= 打印第一行,读入第二行,脚本头部执行
第二行执行,找到 \n= ,替换为空格,从标签a处再执行
第三行执行,没有找到 \n= 打印第二三行的合并和第四行,读入新行,没有了,结束。



我非常敬仰admirer,如有不对,请指正。

论坛徽章:
0
6 [报告]
发表于 2004-03-19 09:52 |只看该作者

请问sed的P命令和D命令的用法

-e :a 定义一个标签位置

理解

$!N 如果不是最后一行,就读入新行附加于pattern space之后,以“\n”分隔

理解

s/\n=/ / 如果发现了新行是以=开头的,替换为空格

理解

ta 如果找到了替换,从标签a处再执行,否则向下走

不理解,这条命令有分条件执行吗?为什么说“如果找到替换再到a执行”,s命令后不是都要执行ta这条命令吗,哪个命令指定这条ta是根据s的结果来处理的?

P 打印 pattern space中的第一个 \n之前的内容
D 删除pattern space中的第一个 \n之前的内容,并返回脚本头部执行

理解


第一行执行,没有找到 \n= 打印第一行,读入第二行,脚本头部执行

是不是先定义标号a,然后N读入下一行,然后执行s替换,因为没有找到替换,所以不执行ta?然后打印模式空间中\n前面内容,就是第一行,再删除模式空间\n前面内容即第一行,保留第二行。
第二行执行,找到 \n= ,替换为空格,从标签a处再执行
第三行执行,没有找到 \n= 打印第二三行的合并和第四行,读入新行,没有了,结束。

此时模式空间里面是第二行。先定义标号a,然后N读入下一行(第三行),然后执行s替换,这时\n就没有了,模式空间是2、3行的合并,然后ta,再N读入下一行(第四行),然后执行s替换,因为没有找到替换,所以不执行ta,然后打印模式空间中\n前面内容,就是二、三行的合并,删除后保留第四行。
这时再执行sed,定义标号a,发现是最后一行,所以N,s,t三个命令都不执行,执行P;D命令,打印第四行,再删除模式空间的内容。


我的理解对吗?
问题:N命令是由前面的$!决定是否执行的,这个我理解。s命令的执行条件是什么?是不是前面的N执行成功s才执行?t命令的执行条件是不是s命令成功才执行?-e :a和-e'P;D'是不是不管什么条件都执行?
请大虾赐教!

论坛徽章:
0
7 [报告]
发表于 2004-03-19 10:24 |只看该作者

请问sed的P命令和D命令的用法

我的第三行执行写的不清楚,图了省事,你的理解很不错,但也有点问题。
    就是这个 -e:a有点问题,我不知道自己理解的是否对,我认为这个标签只定义一次。不是每一行都定义的。还有这个ta 他就相当于if found 替换 goto a;
      s命令的执行无条件,有就替换,没有就不替换;'P;D'是不管什么条件都执行。
    欢迎交流。

论坛徽章:
0
8 [报告]
发表于 2004-03-19 10:46 |只看该作者

请问sed的P命令和D命令的用法

我是觉得sed的每一个命令地位都是相等的,所以我认为-e :a是每读入一行的时候都执行一次。
还有如果s命令没有条件的话,那么t命令为什么就是“if found 替换”才能跳到a呢?s命令为什么不是“if found 替换”再执行替换呢?我觉得s命令和t命令的执行顺序是按顺序执行的,所以如果s命令有执行,t命令也要执行。如果s命令没有执行(当然不考虑s匹配不到自己的正则表达式的情况),那么t命令也不会执行。对吗?
我现在P命令和D命令已经搞明白了,但是命令组合中的命令执行顺序和执行条件越搞越不明白。比如下列几种情况:
sed -e 'comd1' -e 'comd2'
sed -e 'comd1;comd2'
sed -e '$!comd1;comd2'
sed -e '/reg/{comd1;comd2;}'
不知道还有没有其他组合,这几个有什么不同吗?

论坛徽章:
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
9 [报告]
发表于 2004-03-19 11:46 |只看该作者

请问sed的P命令和D命令的用法

COMM:代表命令,PATT:代表pattern space的内容,其他为sed输出的内容
  1. PATT:111111111111111111$
  2. COMM:: a
  3. COMM:$ !N
  4. PATT:111111111111111111\n222222222222222222$
  5. COMM:s/\n=/ /
  6. PATT:111111111111111111\n222222222222222222$
  7. COMM:t a
  8. COMM:P
  9. 111111111111111111
  10. PATT:111111111111111111\n222222222222222222$
  11. COMM:D
  12. PATT:222222222222222222$
  13. COMM:: a
  14. COMM:$ !N
  15. PATT:222222222222222222\n=333333333333333333$
  16. COMM:s/\n=/ /
  17. PATT:222222222222222222 333333333333333333$
  18. COMM:t a
  19. COMM:$ !N
  20. PATT:222222222222222222 333333333333333333\n444444444444444444 $
  21. COMM:s/\n=/ /
  22. PATT:222222222222222222 333333333333333333\n444444444444444444 $
  23. COMM:t a
  24. COMM:P
  25. 222222222222222222 333333333333333333
  26. PATT:222222222222222222 333333333333333333\n444444444444444444 $
  27. COMM:D
  28. PATT:444444444444444444 $
  29. COMM:: a
  30. COMM:$ !N
  31. PATT:444444444444444444 $
  32. COMM:s/\n=/ /
  33. PATT:444444444444444444 $
  34. COMM:t a
  35. COMM:P
  36. 444444444444444444
  37. PATT:444444444444444444 $
  38. COMM:D
复制代码

论坛徽章:
0
10 [报告]
发表于 2004-03-19 15:23 |只看该作者

请问sed的P命令和D命令的用法

看了版主的解释,应该“:a”命令和“ta”命令都是每次读入一行后都要执行的,我的理解对吗?那么仍然有一个疑问:执行了命令t a以后,为什么有时候是执行P命令,有时候是执行$!N命令?这个跳转命令的条件是什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP