Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133977
  • 博文数量: 37
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-02 01:04
个人简介

CU

文章分类

全部博文(37)

文章存档

2016年(33)

2015年(4)

我的朋友

分类: LINUX

2015-09-25 11:17:23

原文地址:sed之N与P 作者:zooyo

    在本文之前我们仔细讲讲sed的工作模式。和awk类似,sed语句的基本结构也是 sed '模式{动作1;动作2}' file 的执行方式。不过sed中有两个空间大家一定要记住,一个叫pattern space(模式空间),一个叫hold buffer(缓冲区/缓冲空间),sed中的模式匹配的对象只是模式空间,和awk一样,sed也是一行一行的读入文本,不过sed在执行命令前,会将文本的行读到模式空间中,然后执行模式{动作}语句,而在执行命令完后,默认sed还是把模式空间的内容打印出来(通过-n 参数可以把最后默认打印模式空间的动作取消)。
    那么我们通过一个我实际研究中的例子来仔细讲解N与P的作用。在使用过程中,相信大家对n和p都比较容易理解的。
  1. seq 6 | sed -n 'N;P'
  2. 1
  3. 3
  4. 5

[解析]

  这个命令就是输出的奇数行,怎么来实现的呢?首先N的作用是读取下一行内容,追加到模式空间里,那sed是逐行执行的,这时候读取1,N把下一行追加到模式空间,那模式空间里的内容就变成了 1\n2 虽然是2行,但是这时候sed把2行看做中间有个换行符的一个整体内容,在模式空间里面。然后继续执行命令P,打印第一行内容。那么1就输出到了屏幕上,接着读取3,N追加4,P输出3,这样一直按这个顺序执行,输出了所有奇数行。这个命令是不是很巧妙?NO,还有一个漏洞。我们看看下面的语句。

  1. seq 5 | sed -n 'N;P'
  2. 1
  3. 3

[解析]

  输出奇数行?5没有输出。是的,这是为什么呢?可以info sed看看N的解释“If there is no more input then 'sed' exits without processing any more commands.”,如果没有可以追加的内容,那么sed将不会处理后面的任何命令。当sed读到5的时候,已经没有下一行内容了,那么N将退出,也不再执行后面的P。所以5没有输出。怎么解决呢?在Tim大师的提点下,明白了。

  1. seq 5 | sed -n '$!N;P'
  2. 1
  3. 3
  4. 5

[解析]

  $!N就是N对最后一行不起作用,哈哈,搞定。

阅读(1517) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~