免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: expert1
打印 上一主题 下一主题

sed里n,N,p,P等用法的区别! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-07-14 18:20 |只看该作者
回复 7# lz66


    为什么是1111?

论坛徽章:
0
12 [报告]
发表于 2010-07-14 20:01 |只看该作者
回复 10# aluoyeshi


    恩。。。。当时脑子抽筋了一时想不起来。。。。

论坛徽章:
0
13 [报告]
发表于 2010-07-15 00:00 |只看该作者
回复  wild_li


    1111\n2222在模式空间当一行处理是吗?
lz66 发表于 2010-07-14 15:48



    11111是一行,,2222是另一行.

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
14 [报告]
发表于 2010-07-15 09:16 |只看该作者

论坛徽章:
0
15 [报告]
发表于 2010-07-15 12:58 |只看该作者
回复 7# lz66


    当使用N时,当前的模式空间中,有两行数据,sed是基于行的,也就是当前行就是模式空间中的数据,你匹配/1111/时,它就显示(p)出它所在的行,而不是字符.

论坛徽章:
1
技术图书徽章
日期:2013-09-25 21:06:29
16 [报告]
发表于 2011-05-01 22:49 |只看该作者
回复 4# lkk2003rty


    爱死你了,,终于弄明白了! 简介明了,顶!

论坛徽章:
0
17 [报告]
发表于 2011-05-02 12:28 |只看该作者
本帖最后由 xiaopan3322 于 2011-05-02 12:30 编辑

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. (追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。如果没有下一个可处理的行,则退出)

N的作用其实是很神奇的:
一方面能够创建多行模式空间,而这时候的多行模式空间之间的\n是隐藏的,即经过N处理过的输出和原来并没有区别,但是sed在读取的时候是以追加的方式:
举个例子:
$ cat file
1
2
3
4
file文件中的每一行后面都有一个隐藏的换行符”\n”,sed不对每行末尾的”\n”进行处理。
$ sed N file
1
2
3
4
经过N处理过的输出和原文件没有区别,但本质是不一样的。这里sed其实认为自己打印的是2行,第一行为”1\n2”,而第2行为”3\n4”,注意这里的2行末尾依然隐藏换行符”\n”,sed依然不处理行尾的”\n”,但是处理行内的”\n”。因为这里默认的动作是打印,所以处理行内的”\n”我们也看不出来。
值得注意的是,处理1时,2被读入并追加到1后面,所以1处理完后不再读入2(前面已经读过了)而直接读入3进行下一个N命令(即读入4并追加到3后面)。

另一方面, N命令在没有下一行可读取的时候,会有退出的作用,关于这个,我觉得可以参看这个:
http://bbs2.chinaunix.net/thread-2312480-1-2.html

论坛徽章:
0
18 [报告]
发表于 2011-05-02 12:33 |只看该作者
D      Delete  up to the first embedded newline in the pattern space.  Start next cycle, but skip reading from the
              input if there is still data in the pattern space.
D 删除模式空间的第一行数据

       h H    Copy/append pattern space to hold space.
h将模式空间的内容放到赞存缓冲区,里面的内容将会被覆盖掉
H是附加到暂存缓冲区
GgNn的区别也在此 !!!!!!
l 是将特殊字符也显示出来
x是将暂存缓冲区的内容与现在模式空间的内容互换

论坛徽章:
2
未羊
日期:2013-11-05 11:40:14双子座
日期:2014-01-03 17:11:01
19 [报告]
发表于 2012-02-03 13:32 |只看该作者
本帖最后由 kanhuijilei 于 2012-02-03 13:32 编辑

回复 4# lkk2003rty
我想问下 echo -e "1111\n2222\n3333" | sed -n 'N;/3333/p(小p)'
我是这么理解的:分别读入1111,2222,3333到模式空间
此时模式空间内容为1111
                         2222
                         3333
那么echo -e "1111\n2222\n3333" | sed -n 'N;/3333/p(小p)'输出的内容应该为1111
                                                                                                          2222
                                                                                                          3333
为什么我执行后输出内容为空?是不是我哪边理解错了?


   

论坛徽章:
0
20 [报告]
发表于 2012-02-03 13:36 |只看该作者
回复 19# kanhuijilei


    读入1111 : 马上读2222,然后没找到3333,所以什么都没做;
    读入3333 : 马上读下一行,但没有下一行了,"If there is no more input then sed exits without processing any more commands. ",立刻退出

    于是什么都没做
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP