菜鸟对一个sed"N;P;D"多行模式处理脚本的分析,请大家指点
时间:2011-04-30
来源:互联网
本帖最后由 xiaopan3322 于 2011-04-30 11:50 编辑
刚开始接触sed的高级用法,心里很悬,总是理解不到位,懊恼的要死……
虽然置顶帖里上传了很多关于sed和awk的经典书籍,不过很惭愧,自己一本也没看过,倒不是因为自己不想看,而是实在是因为工作中全然用不到这些高级的用法,普通功能用用也就差不多了……
不过现在看来,这样是不行滴,至少坛子里的很多问题都帮不上忙,对自己的提高也是一种滞后……
所以我决定从现在起慢慢的多学习下sed和awk……
这样就引出了这篇帖子的主题,这个问题是之前在浏览“白云苍狗”兄的旧帖子里,看到一个sed的回复而引申出来的,(参看:http://bbs.chinaunix.net/redirec ... 674&pid=9947995)
以下是我对这句话的一些理解,希望各位大拿帮小弟看看,虽然对于高手来说很简单,但是对于刚接触的我来说,我觉得还是挺难理解的,反正我是理解了好半天,所以哪里有分析的不对或者不到位的,请大家帮忙指正出来,不甚感激!!!
这里主要是对于sed多行模式空间的N P D操作,先贴上代码:
复制代码
再贴上N P D的解释:
以下是我的分析(首先感谢yinyuemi一下,给了我很多指点,这里就以sed -r ':a;$!N;/#/!s/\n/ /;ta;P;D' urfile为例):
大致可以拆分为3个阶段:
-->
复制代码
-->
复制代码
-->
复制代码
完毕……
请大家拍砖……
刚开始接触sed的高级用法,心里很悬,总是理解不到位,懊恼的要死……
虽然置顶帖里上传了很多关于sed和awk的经典书籍,不过很惭愧,自己一本也没看过,倒不是因为自己不想看,而是实在是因为工作中全然用不到这些高级的用法,普通功能用用也就差不多了……
不过现在看来,这样是不行滴,至少坛子里的很多问题都帮不上忙,对自己的提高也是一种滞后……
所以我决定从现在起慢慢的多学习下sed和awk……
这样就引出了这篇帖子的主题,这个问题是之前在浏览“白云苍狗”兄的旧帖子里,看到一个sed的回复而引申出来的,(参看:http://bbs.chinaunix.net/redirec ... 674&pid=9947995)
以下是我对这句话的一些理解,希望各位大拿帮小弟看看,虽然对于高手来说很简单,但是对于刚接触的我来说,我觉得还是挺难理解的,反正我是理解了好半天,所以哪里有分析的不对或者不到位的,请大家帮忙指正出来,不甚感激!!!
这里主要是对于sed多行模式空间的N P D操作,先贴上代码:
- xiabao@6P9SN2X ~
- $ cat urfile
- #
- 1
- 2
- 3
-
- xiabao@6P9SN2X ~
- $ sed -r ':a;N;/#/!s/\n/ /;ta;P;D' urfile
- #
- 1 2 3
-
- xiabao@6P9SN2X ~
- $ sed -rn ':a;N;/#/!s/\n/ /;ta;P;D' urfile
- #
-
- xiabao@6P9SN2X ~
- $ sed -r ':a;$!N;/#/!s/\n/ /;ta;P;D' urfile
- #
- 1 2 3
-
- xiabao@6P9SN2X ~
- $ sed -rn ':a;$!N;/#/!s/\n/ /;ta;P;D' urfile
- #
- 1 2 3
QUOTE:
P:就是输出模式空间开头到第一个\n之间的内容
D:If pattern space contains no newline, start a normal new cycle as if the d command was issued. Otherwise, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.
(是删除模式空间开头到第一个\n(含)之间的内容,并且控制流跳到脚本的第一条语句。这里一定要注意这句话“and restart cycle with the resultant pattern space, without reading a new line of input.”,即它是在不改变当前行号的情况下,从头执行的。)
这句话也充分的说明了,为什么很多人不愿意读中文翻译版书籍的原因。:-)
N:Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then sed exits without processing any more commands. (追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。如果没有下一个可处理的行,则退出)
D:If pattern space contains no newline, start a normal new cycle as if the d command was issued. Otherwise, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.
(是删除模式空间开头到第一个\n(含)之间的内容,并且控制流跳到脚本的第一条语句。这里一定要注意这句话“and restart cycle with the resultant pattern space, without reading a new line of input.”,即它是在不改变当前行号的情况下,从头执行的。)
这句话也充分的说明了,为什么很多人不愿意读中文翻译版书籍的原因。:-)
N:Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then sed exits without processing any more commands. (追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。如果没有下一个可处理的行,则退出)
以下是我的分析(首先感谢yinyuemi一下,给了我很多指点,这里就以sed -r ':a;$!N;/#/!s/\n/ /;ta;P;D' urfile为例):
大致可以拆分为3个阶段:
QUOTE:
#
1
2
3
1
2
3
-->
QUOTE:
#\n1
2\n3
2\n3
- (经过N处理过的输出和原文件没有区别,但是本质是不一样的,我这里为了方便表述,把隐藏的\n写到了同一行)
- (读入第一个pattern space /#/,$!成立,执行N命令,创建多行模式空间,结果如上所示)
- (紧接着,读入pattern space /#\n1/,/#/!条件不成立,不执行s/\n//,跳过ta,执行P,打印”#“,执行D,删除"#\n",pattern space内容为/1/)
QUOTE:
#
1\n2\n3
1\n2\n3
- (注意,这里的#的输出是P和D作用的结果,参照第一步)
- (因为D命令执行成功后会使得控制流跳到脚本的第一条语句,这里,也即跳到了:a处,也即进入了一个新的循环)
- (新的循环开始,从:a开始执行。注意:不是读入下一行开始,从:a开始执行,所以当前的行号是2,也就说$!永远成立,这也就说明了N前面加不加$!都是可以,效果一样。)
QUOTE:
#
1 2 3
1 2 3
- (这里之所以输出1 2 3,不是因为执行了后面的P和D,而是因为当s/\n//执行成功后跳转到了标签a处,又因为N没有下一行可读了,所以就exit了,不再执行后面的命令(这里说明退出循环是N的作用),这时候pattern space的内容是/1 2 3/,因此就被输出到了标准输出上。(这也间接说明了加了-n后1 2 3就被抑制输出了))
请大家拍砖……
作者: xiaopan3322 发布时间: 2011-04-30
sed果然虚幻。。。
作者: zooyo 发布时间: 2011-04-30
确实分析得很好,谢谢分享,也敬佩楼主钻研和共享、严谨的治学精神。
作者: zooyo 发布时间: 2011-04-30
什么时候疑惑了,就sedsed一下,必定豁然开朗:
http://sedsed.sourceforge.net/
http://sedsed.sourceforge.net/
作者: Shell_HAT 发布时间: 2011-04-30
回复 Shell_HAT
恩,我是想先自己试着分析下,然后再用sedsed跑,这样比较深刻……不易忘……
恩,我是想先自己试着分析下,然后再用sedsed跑,这样比较深刻……不易忘……

作者: xiaopan3322 发布时间: 2011-04-30
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28