Chinaunix

标题: sed的N命令 [打印本页]

作者: linuxocp    时间: 2010-11-12 11:28
标题: sed的N命令
[root@oracle ForVMC]# cat m
Unix System
G.D. Unix System
G.D.

[root@oracle ForVMC]# sed -n 'N;p' m
Unix System
G.D. Unix System
                                
[root@oracle ForVMC]# sed -n '$!N;p' m
Unix System
G.D. Unix System
G.D.

[root@oracle ForVMC]# sed 'N' m
Unix System
G.D. Unix System
G.D.  --这行为什么会打印出来呢?m只有三行,在N作用于最后一行的时候应该是立即退出的啊?且不打印这行的;虽然没有指定-n选项,但是默认的p命令应该是被当成最后一个命令,但是现在这样的输出又好像是N在应用于最后一行时p是在N前执行的??!!
作者: linuxocp    时间: 2010-11-12 11:36
我希望的执行步骤和结果:
[root@oracle ForVMC]# cat m
Unix System
G.D. Unix System
G.D.

[root@oracle ForVMC]# sed 'N' m
Unix System   
G.D. Unix System
G.D.

读取第一行时: step1:应用N命令-->模式空间内容Unix System\nG.D. Unix System
                             step2:遇到隐式的p命令(因为没有-n选项),打印输出Unix System\nG.D. Unix System
                             step3:读取第三行-->尝试应用N,但是没有下一行了,sed立即退出,后面的隐式p命令没有执行

按照我的想法,最后的输出应该只有Unix System\nG.D. Unix System的啊?还请哪位指点下,谢谢
作者: linuxocp    时间: 2010-11-12 11:39
在学sed,搞到这里有点晕
作者: rpbear    时间: 2010-11-12 11:41
最后一行不是N命令读入的,而是默认的获取下一行
作者: linuxocp    时间: 2010-11-12 11:48
回复 4# rpbear


    你好,谢谢你的回复,不过还是不理解,你能按照我在2楼的解释步骤解释下么,呵呵,我的理解能力有限,谢谢了
作者: linuxocp    时间: 2010-11-12 11:50
主要是第三步,sed肯定不是以我这样的机制来工作的,所以重点帮忙解释下这步
作者: rpbear    时间: 2010-11-12 11:54
脚本开始运行的时候
Unix System被默认读入模式空间,然后执行N,模式空间变为
Unix System\nG.D.Unix System然后执行隐式p,打印得到

Unix System   
G.D. Unix System
之后默认加载下一行输入,然后执行N,这是最后一行所以按你说的退出了,之后执行隐式的p输出最后一行,也就得到了最后结果
作者: linuxocp    时间: 2010-11-12 12:02
[root@oracle ForVMC]# sed 'N;s/G/M/' m
Unix System
M.D. Unix System
G.D.

N如果没有下一行可读的,N后面的命令是不会执行的(类似d命令),但是上面这个例子好像是这样的:
N跳过了所有的显式命令总是执行最后的隐式p命令,是这样么?
作者: rpbear    时间: 2010-11-12 12:07
我觉得是这样的,模式空间里有内容的时候,只要没有抑制输出(-n),就会输出最后的内容,即使N退出。你可以测试这个脚本理解一下N在最后一行的行为
sed -n "N;p" file
如果什么错误也请大家指出,我也刚学呵呵回复 8# linuxocp
作者: linuxocp    时间: 2010-11-12 12:12
回复 9# rpbear


    嗯,这样理解很好,我总是认为把没有-n选项的sed是通过最后添加p命令来实现的,而你是基于模式空间是否有内容来判断;看来目前只能这样理解了,谢谢朋友
作者: lkk2003rty    时间: 2010-11-12 13:38
可以用sedsed看一下
http://sedsed.sourceforge.net/
作者: L_kernel    时间: 2010-11-12 15:48
回复  rpbear


    嗯,这样理解很好,我总是认为把没有-n选项的sed是通过最后添加p命令来实现的,而你 ...
linuxocp 发表于 2010-11-12 12:12



    我把N命令的英文解释给你看看吧。The 'N' command does not print out the current pattern space and does not empty the pattern space.
It reads in the next line, but appends a new line character along with the input line itself to the pattern space.
作者: linuxocp    时间: 2010-11-12 17:28
呵呵,其实这个帖子已经不是N的问题了,而是我对sed -n和没有-n时的工作机制理解有问题,N命令本身很容易理解




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2