免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7750 | 回复: 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
18 [报告]
发表于 2004-03-19 17:12 |只看该作者

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

b和t命令的区别是不是前者是无条件跳转,后者是s命令成功后才跳转?
为什么要我注意b命令的说明,和我举的例子有什么关系吗?

论坛徽章:
0
17 [报告]
发表于 2004-03-19 16:35 |只看该作者

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

呵呵,我拷贝你的文件,文件末尾多了一个空行,所以4个正好能打印出来,我试了的。

另请注意我之前的关于b[label]的说明。

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

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

发完帖子看到skydog兄的回帖,我想我的思考是对的了,但是skydog举的例子有一个问题,“ccc……”那一行的字符个数如果是4个仍然不能打印出来,如果改成3个或以下才能打印出下面几行的内容。

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

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

[quote]原帖由 "forest077"]看了版主的解释,应该“:a”命令和“ta”命令都是每次读入一行后都要执行的,[/quote 发表:


请看b[label]的用法说明:

The label is optional, and if not supplied, control is transferred to the end of the script. If alabel is supplied, execution resumes at the line following the label.

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

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

哦,我明白了,因为我刚才在我的例子里面发现了一个问题:
  1. sed -e :a -e'N;s/c/1/;ta' eee
复制代码

在s命令里面没有指明替换第几个,所以缺省只替换了第一个,那么在N读入第四行时,
  1. PATT=ccccc\nddd
复制代码

s命令之后,
  1. PATT=1cccc\nddd
复制代码

ta命令之后,N读入第五行,
  1. PATT=1cccc\nddd\neee
复制代码

s命令之后,
  1. PATT=11ccc\nddd\neee
复制代码

所以ta命令继续跳转,再读入第六行,
  1. PATT=11ccc\nddd\neee\nfff
复制代码

s命令之后,
  1. PATT=111cc\nddd\neee\nfff
复制代码

……
……
所以文件读完后,因为s命令一直成功,t命令仍要执行,所以循环还没有结束,模式空间就不打出来了。如果把第三行少写几个“c”,或者eee文件多写几行,最后就可以打印出全部替换过的文件了。

实践+思考+他人帮助是成功掌握一门知识的不二法门哪。

论坛徽章:
0
13 [报告]
发表于 2004-03-19 16:17 |只看该作者

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

呵呵,搂主很认真啊,这挺好的,不用怕麻烦。

你试着将你的文件改一下,改为如下:
  1. aaa
  2. bbbbb
  3. cccc
  4. ddd
  5. eee
  6. fff
  7. gggg
复制代码

就会发现,sed -e :a -e'N;s/c/1/;ta' file 输出的又有了。
我就不解释了,自己思考一下吧。

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

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

看上面这段英文解释,t命令在读入一行或者上次t命令后如果有个s命令执行成功,那么t命令就跳转,否则不跳转,这个解释和我系统上面的man基本一样。
用这个解释来说明版主上面的流程,我想我是懂了。但是我自己设计了一个例子,运行结果又让我糊涂了,所以我可能不是真懂。
例子是这样的:

  1. cat eee
  2. aaaa
  3. bbbbb
  4. ccccc
  5. ddd
  6. eee
  7. fff
  8. gggg
复制代码

运行命令

  1. sed -e :a -e'N;s/b/1/;ta' eee
  2. aaaa
  3. 11111
  4. ccccc
  5. ddd
  6. eee
  7. fff
  8. gggg
复制代码

运行命令

  1. sed -e :a -e'N;s/c/1/;ta' eee
  2. aaaa
  3. bbbbb
复制代码

后者的执行结果我无论如何没法理解。
我先说一下我对后者的理解:
读入第一行aaa,执行N读入第二行bbb,执行s替换,没有成功,不执行ta,打印模式空间,内容是aaa\nbbb
读入第三行ccc,执行N读入第四行ddd,执行s替换成功,模式空间是111\nddd,执行ta,再执行N读入第五行,模式空间是111\nddd\neee,执行s替换不成功,我认为此时ta应该不执行,结束命令打印模式空间111\nddd\neee,可是为什么没有?
然后应该读入第六行……,最后结果应该和前者一样,可是为什么打印到bbb这行就嘎然而止了?
希望版主和诸位大虾不要被我的无知和罗嗦吓跑,发扬耐心的传帮带的风格,谢谢。

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

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

请参考一下
  1. t label
  2.               If  a  s///  has  done  a successful substitution since the last
  3.               input line was read and since the last  t  or  T  command,  then
  4.               branch to label; if label is omitted, branch to end of script.
复制代码

论坛徽章:
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