在前面看到的都是单行模式。每次sed处理一个行。

但是sed是允许一次处理多行的。这就是所谓的多行模式空间。

多行模式空间命令有(N、D、P),他们分别对应单行模式空间(n、d、p)。

分别是他们的多行形式。只不过,d每次删除一行,而D每次删除多行模式空间中的“一行”,其实就是一个记录。

下面举例子。我们假设有一个文件,loves cc两个单词分散在不同的行。我们想通过sed将二者放在同一行。

  1. zoer@ubuntu:~$ cat data
  2. naughty loves
  3. cc,and cc loves naughty.
  4. they are very happy!
  5. zoer@ubuntu:~$ cat d
  6. N
  7. s/loves\ncc/loves cc\
  8. /
  9. zoer@ubuntu:~$ sed -f d data
  10. naughty loves cc
  11. ,and cc loves naughty.
  12. they are very happy!

例子中,使用N来创建多行模式空间,将loves\ncc直接替换成loves cc,然后在sed命令的末尾使用\来表示换行。则得到了上面的结果。

上面sed命令中的loves c\,反斜杠是换行之意。如果没有它,那么两行将成为一行。如下所示:

  1. zoer@ubuntu:~$ cat d
  2. N
  3. s/loves\ncc/loves cc\ /
  4. zoer@ubuntu:~$ sed -f d data
  5. naughty loves cc ,and cc loves naughty.
  6. they are very happy!

---------------------------------------------------------

注意,sed命令中,也是可以使用{}的。但是与awk中的{}是不同的。

sed中的{}用法:

/条件/{符合条件的组合命令}      请注意这里的“条件”,只有符合条件的才会进入后面的组合命令。

意思是说,对符合前面条件的行,执行后面的组合命令。命令中可以包含一条或者多条命令。

而awk中的{}则分为BEGIN、END等作用。【不过个人认为,awk中的{}也有一部分的功能是组合一组命令】

-----------------------------------------------------

多行删除

假设我们有一个文件中有很多空白行,现在需要把多个相邻的空白行只保留一个。怎么做?

如果仅仅使用sed的d命令,那么这么写:

  1. zoer@ubuntu:~$ cat d
  2. /^$/{
  3. N
  4. /^\n$/d
  5. }
  1. zoer@ubuntu:~$ cat data
  2. naughty loves
  3. cc,and cc loves naughty.
  4. they are very happy!
  5. here is any.
  6. and here.
  7. zoer@ubuntu:~$ sed -f d data
  8. naughty loves
  9. cc,and cc loves naughty.
  10. they are very happy!
  11. here is any.
  12. and here.

我们会发现,偶数行连在一起的,都被删除了。而奇数行连在一起的会留下一行。这是为什么?

解释一下上面使用d命令的sed脚本就明白了。

上面的 sed脚本中,

读取一行,如果是 空行,那么符合条件,由于使用了N,所以会接着读取下一行。

如果此行是空行,那么符合^\n$,sed会由于d命令而删除整个模式空间,所以两个空行都被删除了。【同理如果有四个空行,那么可以看做是两倍的两个空行】

如果此行不是空行,那么不符合^\n$,sed会输出之前的空行和当前的这个非空行。

这就是为什么使用d的时候,偶数个连在一起的空白行被全部删了。而奇数个的还留有一行空白。

----------------------

如果使用D,世界瞬间安静了。

  1. zoer@ubuntu:~$ cat data
  2. naughty loves
  3. cc,and cc loves naughty.
  4. they are very happy!
  5. here is any.
  6. and here.
  7. zoer@ubuntu:~$ sed -f d data
  8. naughty loves
  9. cc,and cc loves naughty.
  10. they are very happy!
  11. here is any.
  12. and here.

如果使用D,当读取到空行的时候,符合匹配的条件^$,然后会读取下一行,

1、如果不是空行,那么不匹配,输出之前的空行和刚刚读入的这个非空行。

2、如果是空行,那么匹配^\n$,此时删除上一个空行,将本次的空行作为输入继续运行这个脚本。显然,此时空行也是满足^$的,所以继续读取接下来的文件,重复1。

----------------------------------------------

多行打印

我们通过下面的例子来学习多行打印的P命令。

  1. zoer@ubuntu:~$ cat d
  2. /unix$/{
  3. N
  4. /\nsystem/{
  5. s// operating &/
  6. P
  7. D
  8. }
  9. }
  10. zoer@ubuntu:~$ cat data
  11. here are examples of the unix
  12. system. where unix
  13. system appears,it should be the unix
  14. operating system.
  15. zoer@ubuntu:~$ sed -f d data
  16. here are examples of the unix operating
  17. system. where unix operating
  18. system appears,it should be the unix
  19. operating system.

这里例子中,我们要匹配unix结尾的行,并且如果下一行是system,那么在unix之后加上operating。

注:在sed中,&意思是用正则表达式的内容替换掉读入的内容。另外,//之间不加任何内容,表示的是上一次的匹配。在这例子中就是\nsystem。

命令的执行过程如下:

首先读入一行。如果结尾匹配unix,那么读入下一行。

1、如果下一行以system开头,那么将system替换成 operating \nsystem,然后打印出来该替换之后的行并把原来的 行删除。

2、如果下一行不是system开头,那么以改行为输入,继续匹配是否以unix结尾。

转自:http://blog.csdn.net/imzoer/article/details/8740673

【转】SED多行模式空间的更多相关文章

  1. 【转】 SED多行模式空间

    1. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2. 为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间 ...

  2. 【shell】sed指定追加模式空间的次数

    最近遇到一个文本复制的场景,需要把文本的每一行都重复输出三次. 这个用awk或者sed实现都还是很简单的. sed代码: [root]$ seq | sed '{h;G;G}' 现在的问题是,如果每行 ...

  3. sed高级用法:模式空间(pattern space)和保持空间(hold space)

    摘自:https://blog.csdn.net/ITsenlin/article/details/21129405 sed高级用法:模式空间(pattern space)和保持空间(hold spa ...

  4. 借个例子说明sed的模式空间,以及针对模式空间的N,P,D用法

    下面是我们要处理的文本:题目要求是把所有散列在不同行的同一个中括号中的数据集中在一起, 见下表就秒懂了吧 处理前的文本 处理后的文本 [123456][ASDEF][ABCD123WF][789ADC ...

  5. 通过几个例子看sed的模式空间与保持空间

    SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使 ...

  6. sed的模式空间和保持空间

    摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809 sed的模式空间和保持空间 2016年06月06日 17:15 ...

  7. sed原理及sed命令格式 ,缓存区,模式空间

    4.1            Sed工作原理 sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从 ...

  8. sed 模式空间 保持空间

    sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的"模式空间(pattern space)",另一个是起辅助作用的"保持空间(hold s ...

  9. sed 之 模式空间 & 保持空间

    模式空间:容纳当前输入行的缓冲区: 保持空间:作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间. 由上面定义可以知道,模式空间和保持空间是两个独立的缓冲区,可以进行交互,命 ...

随机推荐

  1. 微信app支付(android端+java后台)

    本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧 ...

  2. 14、ABPZero系列教程之拼多多卖家工具 新建微信公众号模块

    说是模块,其实在MVC中就是区域,新建一个区域专门管理整个微信功能. Web项目新建区域 在Web项目Areas目录下新建一个区域,名称为“Weixin",如下图: 接着打开web.conf ...

  3. metasploit魔鬼训练营(收集外围信息)

    现在我们时空穿越,来到魔鬼训练营的主角身上,现在我们要训练,对V公司进行渗透测试,回想起总监说的情报收集 1,外围搜集,指的是自己假装是一个正常用户来搜集情报 我们开启msf用auxiliary/sc ...

  4. Codility:Titanium 2016 challenge:BracketsRotation

    发现codility上很难找到自己的代码,所以来存一下. 用的一种水法,不知道是结论对还是数据水. 处理出所有极大合法串最后就只剩)))((((状的括号,然后枚举右端点,左端点单调. 但是未匹配点数量 ...

  5. 微积分入门("SX"T版)

    哎,微积分,表示暂时并没有很深入的研究……虽然高中有教,但是好像跟小西瓜学的顺序不太一样,嗯……教微积分之前不应该把极限学下来么……不管了,本文按傻X腾的理解来搞吧. 极限……大学的东西喔,我们先来认 ...

  6. Codeforces Round #326 (Div. 2) B

    1.每一个合数都可以由若干个素数相乘而得到 2.质因数知识 :求一个数因数的个数等于它的每个质因数的次数加一的和相乘的积因为质因数可以不用,所以要加一.例如6=2x3,两个质因数都是一次,如果两个质因 ...

  7. cin与cout详解

    输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。C++的输出和输入是用" ...

  8. mysql中配置ssl_key、ssl-cert、ssl-ca的路径及建立ssl连接

    1.创建 CA 私钥和 CA 证书 (1)下载并安装openssl,将bin目录配置到环境变量: (2)设置openssl.cfg路径(若不设置会报错,找不到openssl配置文件) \bin\ope ...

  9. Servlet面试题归纳

    尊重原创:http://blog.csdn.net/caohaicheng/article/details/38116481 1.说一说Servlet生命周期 Servlet生命周期包括三部分: 初始 ...

  10. TCP为什么需要3次握手与4次挥手(转载)

    为什么需要“三次握手” 在谢希仁著<计算机网络>第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”.在另一部经典的<计算机网络> ...