sed 高级用法(1) 之 n N

前言

我在参考其它多个Blog中发现,有些Blog中sed的功能介绍和实际有出入,这可能和版本有关系,正如sed文档中所说“might change in future versions”,所以本文sed是以4.2.1为例。如果以后sed更新版本了,有可能会不一样。

好记性不如烂笔头!

sed的工作原理

sed维护着两个数据的缓冲空间,一个是模式空间(pattern space)和另外一个保留空间(hold space),在初始环境下都为空。

sed是一个流编辑器,它会循环的从输入流中读取每一行,直到读完整个文件。具体如下:

首先,它会从输入流中读取一行(如果刚开始就是第一行),移除行尾的换行符,放置于模式空间当中,接着一条条的运行命令(命令可以有多个并且是按序执行,如果某个命令地址定界了一个行号,只有满足该行号才会执行命令,如“1d”,意思是如果是第一行则删除模式空间内的内容)。

当命令运行完毕之后,除非使用了 -n 选项,否则会把模式空间的内容加上之前删过的换行符并打印到输出。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。

意译自http://www.gnu.org/software/sed/manual/sed.html中 3.1 How sed Works

流程图如下

sed 工作原理.jpg

注:上面只是标准流程,某些特殊命令会有自己的流程


n N的说明

范例文件1

[root@CZ tmp]# cat 1
1
2
3
4
5
6
7
8
9
10
11

 

n:打印当前模式空间内容,然后读取下一行并替代当前模式空间的内容。如果读取不到下一行sed则会不运行之后的命令

我们通过以下命令了解一下n

[root@CZ tmp]# sed 'n;d' 1
1
3
5
7
9
11

上面命令过程是这样

  1. 先读取第一行进模式空间(以后简称为1)

  2. 执行命令n,过程如下

    1. 打印1到输出

    2. 读取2并覆盖到模式空间

  3. 执行命令d,过程如下

    1. 删除模式空间的内容

    2. 立即执行下一循环(d命令在运行后会直接执行下一循环,所以它并不会执行之后的命令和打印模式空间,具体d介绍会留在下次分享)

  4. 按照上面的流程循环执行…….直到读取到11(最后一行),11的具体过程如下

    1. 读取11进模式空间

    2. 运行命令n,不过读取不到下一行

    3. 因为读不到,所以sed退出所有的命令,也就是说它不会执行命令d

    4. 加回换行符并打印模式空间的内容到输出,当前模式空间内容为11,所以输出11

  5. 已经是文件尾,sed结束运行。 

 

N:读取下一行并且附加到当前模式空间内,如果读取不到下一行sed则会不运行之后的命令

我们通过以下命令了解一下N

[root@CZ tmp]# sed 'N;a---' 1
1
2
---
3
4
---
5
6
---
7
8
---
9
10
---
11

上面命令过程是这样

  1. 读取1进模式空间

  2. 执行命令N

    1. 读取2并附加到模式空间,当前模式空间内容为“1\n2”

  3. 执行命令a—

    1. 在模式空间后附加一行‘—’当前模式空间内容为“1\n2\n—"

  4. 打印模式空间内容

  5. 循环执行直到读取11进模式空间,11的具体过程如下

    1. 读取11进模式空间

    2. 执行命令N,不过读取不到下一行

    3. 因为读不到,所以sed退出所有的命令,也就是说它不会执行命令a

    4. 加回换行符并打印模式空间的内容到输出,当前模式空间内容为11,所以输出11

  6. 已经是文件尾,sed结束运行。 

尾言

n N经常和d D一起用,不过D有点复杂,所以留在下次分享,不过我先剧透一下,D会删除模式空间内第一行,并且如果模式空间内容不为空,它会循环执行前面命令。直到为空才会执行下一循环。


参考

http://www.gnu.org/software/sed/manual/sed.html

上面是官方文档,如果下面和上面冲突,请以上面为准,下面blog有些内容和我理解有出入,请自行判断。

http://www.cnblogs.com/fhefh/archive/2011/11/14/2248942.html

http://www.cnblogs.com/theCambrian/p/3606214.html    
http://blog.csdn.net/yanquan345/article/details/19613443

http://www.cnblogs.com/fhefh/archive/2011/11/22/2259097.html


 

原创文章,作者:Unknown,如若转载,请注明出处:http://www.178linux.com/5900

(0)
UnknownUnknown
上一篇 2015-07-03
下一篇 2015-07-03

相关推荐

  • 上古神器之vim

    sed 前言:前面学到了文本处理三剑客之一grep,但是grep在有些时候显得力不从心,我们需要一款针对行操作的处理工具,没错,这就是sed流编辑器。 sed用法提炼: sed 's/(text1)(text2)(text3)/\1\2\3/'  vim 前言:强大的Linux如果没有一款疯狂的编辑器,常用的编辑操作会…

    Linux干货 2016-08-12
  • 26期全程班-第七周博客作业

    1、创建一个10G分区,并格式为ext4文件系统;    (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;    (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; # fdisk /dev/sda # mkf…

    Linux干货 2017-03-17
  • 新的篇章

    第一天,linux,努力,奋斗!

    Linux干货 2017-07-11
  • Linux文件系统总结(7.4课上作业)

    一、什么是文件系统         文件系统是对一个存储设备上的数据和元数据进行组织的机制。它使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用的数据块的概念,用户使用文件系统来保存数据而不必关心数据实际保存在硬盘(or光盘)的地址为多少数据块上,只需要记住这个文件的…

    Linux干货 2016-07-10
  • 由摩根定律引发的思考

    在Linux中,我们常常需要对一些条件进行判断,而对于多个条件的组合判断是基于摩根定律而进行的。所以理解摩根定律对于我们学习条件判断是很有必要的,下面我们就先介绍摩根定律进而引出其在一些具体场景上的应用。   一、摩根定律 在Linux中的条件判断中,摩根定律可以以下式来表示: !( A || B )=!A && !B !( A &…

    Linux干货 2016-08-16
  • Linux终端类型

    Linux系统的终端主要包括控制台终端、控制终端、串口终端、伪终端、虚拟终端。 1、控制台终端(/dev/console)    在Unix系统中,计算机显示器通常被称为控制台终端。Console与虚拟终端相关联,内核将信息送到控制台终端上(/dev/console), 通过与console相关联的虚拟终端将信息显示到屏幕上。不管当前正在…

    Linux干货 2016-10-19