免费注册 查看新帖 |

Chinaunix

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

sed求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-18 13:52 |只看该作者 |倒序浏览
# 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
sed -n '/regexp/{g;1!p;};h'

我看这行代码,这其中的1!p是啥作用呢?
[root@sunxia]~/sed# cat 22.txt
111
222
333
444
555
666
777
888
999
101
# sed -n '/222/{g;1!p;};h' 22.txt
111
这是显示结果,我的分析是在读入一行后,如果不匹配222,则放到保持空间里面,当匹配了222后执行g,把保持空间的内容放到模式空间,后执行1!p,可是我不是很理解1!p的意思。继续读入333后,不匹配222放到保持空间,因为抑制输出,所以不输出。
如果我把代码改为
# sed -n '/333/{g;1!p;};H' 22.txt

111
222
则输出这样的,在这里我还是不能理解1!p的意思,g把保持空间里面的空格和111还有222都取到模式空间,现在模式空间里面有三行,执行1!p后是输出了这样的结果,而1!p的作用是什么呢?我单独# sed '1!p' 22.txt 这命令我知道是第一行的不执行p命令,即正常输出,其他行执行p打印命令,会输出两行。可是这是在模式空间里面只有一行的时候,如果模式空间里面多行的时候,又改怎么理解呢? 我现在对模式空间里面有多行理解的不是很到位,希望有高手给讲讲

论坛徽章:
0
2 [报告]
发表于 2011-01-18 14:02 |只看该作者
1!p只是防止匹配行在第一行时的情况,如直接p,则会多输出一个空行

论坛徽章:
0
3 [报告]
发表于 2011-01-18 14:45 |只看该作者
哦 明白了 这几天看的头晕了,弄的自己有些糊涂,谢谢

论坛徽章:
0
4 [报告]
发表于 2011-01-18 15:31 |只看该作者
# 显示文件中的最后10行 (模拟“tail”)
sed -e :a -e '$q;N;11,$D;ba'
这又咋解释呢?

论坛徽章:
0
5 [报告]
发表于 2011-01-18 16:09 |只看该作者
sed -e :a -e '$q;N;3,$D;ba' 22.txt  解释:当输入第一行时,执行命令N,后现在模式空间内有两行(即 111 222),222 在第二行,不符

合命令3,$D所以不执行,接下来执行ba后重新执行'$q;N;3,$D;ba' 因为现在222不是最后一行,所以不执行$q,而继续执行N,这时模式空间内

有三行(111 222 333)然而新读入的333匹配(3,$D这个命令即333在第三行),所以执行到该命令后删除模式空间内的111,现在模式空间内

有222和333,因为执行的是D,所以返回到脚本的顶端,重新执行脚本,因为333又不满足$q,后执行N,这时模式内成了222,333,444又因为444

在第四行,满足3,$D,所以执行完这个命令后剩下333,444,这时按照刚才的继续重复执行N等等,一直这样,当执行完3,$D这个后模式空间内

成为888 和999了,返回脚本顶端,因为999不在最后一行,所以执行N,这时读入模式空间的内容成为了888 999 101 因为101这时还是在3,$D

这个范围内,所以执行D删除,模式空间剩下了999 101 并且返回脚本的顶端。这时因为101是最后一行,执行$q,后推出脚本并且输出模式空间

的内容

论坛徽章:
0
6 [报告]
发表于 2011-01-18 16:10 |只看该作者
这是我的理解,不知道正确不,如果我的理解不正确希望高手给指出来。我在这里表示感谢{:2_168:}

论坛徽章:
0
7 [报告]
发表于 2011-01-18 16:16 |只看该作者
回复 4# 虎出山


    就是pattern  space始终保持十行数据

论坛徽章:
0
8 [报告]
发表于 2011-01-18 16:24 |只看该作者
谢谢指点,那我刚才分析执行的过程应该正确吧  (*^__^*) 嘻嘻……

论坛徽章:
0
9 [报告]
发表于 2011-01-18 17:19 |只看该作者
谢谢指点,那我刚才分析执行的过程应该正确吧  (*^__^*) 嘻嘻……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP