【转】SED多行模式空间
在前面看到的都是单行模式。每次sed处理一个行。
但是sed是允许一次处理多行的。这就是所谓的多行模式空间。
多行模式空间命令有(N、D、P),他们分别对应单行模式空间(n、d、p)。
分别是他们的多行形式。只不过,d每次删除一行,而D每次删除多行模式空间中的“一行”,其实就是一个记录。
下面举例子。我们假设有一个文件,loves cc两个单词分散在不同的行。我们想通过sed将二者放在同一行。
- zoer@ubuntu:~$ cat data
- naughty loves
- cc,and cc loves naughty.
- they are very happy!
- zoer@ubuntu:~$ cat d
- N
- s/loves\ncc/loves cc\
- /
- zoer@ubuntu:~$ sed -f d data
- naughty loves cc
- ,and cc loves naughty.
- they are very happy!
例子中,使用N来创建多行模式空间,将loves\ncc直接替换成loves cc,然后在sed命令的末尾使用\来表示换行。则得到了上面的结果。
上面sed命令中的loves c\,反斜杠是换行之意。如果没有它,那么两行将成为一行。如下所示:
- zoer@ubuntu:~$ cat d
- N
- s/loves\ncc/loves cc\ /
- zoer@ubuntu:~$ sed -f d data
- naughty loves cc ,and cc loves naughty.
- they are very happy!
---------------------------------------------------------
注意,sed命令中,也是可以使用{}的。但是与awk中的{}是不同的。
sed中的{}用法:
/条件/{符合条件的组合命令} 请注意这里的“条件”,只有符合条件的才会进入后面的组合命令。
意思是说,对符合前面条件的行,执行后面的组合命令。命令中可以包含一条或者多条命令。
而awk中的{}则分为BEGIN、END等作用。【不过个人认为,awk中的{}也有一部分的功能是组合一组命令】
-----------------------------------------------------
多行删除
假设我们有一个文件中有很多空白行,现在需要把多个相邻的空白行只保留一个。怎么做?
如果仅仅使用sed的d命令,那么这么写:
- zoer@ubuntu:~$ cat d
- /^$/{
- N
- /^\n$/d
- }
- zoer@ubuntu:~$ cat data
- naughty loves
- cc,and cc loves naughty.
- they are very happy!
- here is any.
- and here.
- zoer@ubuntu:~$ sed -f d data
- naughty loves
- cc,and cc loves naughty.
- they are very happy!
- here is any.
- and here.
我们会发现,偶数行连在一起的,都被删除了。而奇数行连在一起的会留下一行。这是为什么?
解释一下上面使用d命令的sed脚本就明白了。
上面的 sed脚本中,
读取一行,如果是 空行,那么符合条件,由于使用了N,所以会接着读取下一行。
如果此行是空行,那么符合^\n$,sed会由于d命令而删除整个模式空间,所以两个空行都被删除了。【同理如果有四个空行,那么可以看做是两倍的两个空行】
如果此行不是空行,那么不符合^\n$,sed会输出之前的空行和当前的这个非空行。
这就是为什么使用d的时候,偶数个连在一起的空白行被全部删了。而奇数个的还留有一行空白。
----------------------
如果使用D,世界瞬间安静了。
- zoer@ubuntu:~$ cat data
- naughty loves
- cc,and cc loves naughty.
- they are very happy!
- here is any.
- and here.
- zoer@ubuntu:~$ sed -f d data
- naughty loves
- cc,and cc loves naughty.
- they are very happy!
- here is any.
- and here.
如果使用D,当读取到空行的时候,符合匹配的条件^$,然后会读取下一行,
1、如果不是空行,那么不匹配,输出之前的空行和刚刚读入的这个非空行。
2、如果是空行,那么匹配^\n$,此时删除上一个空行,将本次的空行作为输入继续运行这个脚本。显然,此时空行也是满足^$的,所以继续读取接下来的文件,重复1。
----------------------------------------------
多行打印
我们通过下面的例子来学习多行打印的P命令。
- zoer@ubuntu:~$ cat d
- /unix$/{
- N
- /\nsystem/{
- s// operating &/
- P
- D
- }
- }
- zoer@ubuntu:~$ cat data
- here are examples of the unix
- system. where unix
- system appears,it should be the unix
- operating system.
- zoer@ubuntu:~$ sed -f d data
- here are examples of the unix operating
- system. where unix operating
- system appears,it should be the unix
- 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多行模式空间的更多相关文章
- 【转】 SED多行模式空间
1. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2. 为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间 ...
- 【shell】sed指定追加模式空间的次数
最近遇到一个文本复制的场景,需要把文本的每一行都重复输出三次. 这个用awk或者sed实现都还是很简单的. sed代码: [root]$ seq | sed '{h;G;G}' 现在的问题是,如果每行 ...
- sed高级用法:模式空间(pattern space)和保持空间(hold space)
摘自:https://blog.csdn.net/ITsenlin/article/details/21129405 sed高级用法:模式空间(pattern space)和保持空间(hold spa ...
- 借个例子说明sed的模式空间,以及针对模式空间的N,P,D用法
下面是我们要处理的文本:题目要求是把所有散列在不同行的同一个中括号中的数据集中在一起, 见下表就秒懂了吧 处理前的文本 处理后的文本 [123456][ASDEF][ABCD123WF][789ADC ...
- 通过几个例子看sed的模式空间与保持空间
SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使 ...
- sed的模式空间和保持空间
摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809 sed的模式空间和保持空间 2016年06月06日 17:15 ...
- sed原理及sed命令格式 ,缓存区,模式空间
4.1 Sed工作原理 sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从 ...
- sed 模式空间 保持空间
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的"模式空间(pattern space)",另一个是起辅助作用的"保持空间(hold s ...
- sed 之 模式空间 & 保持空间
模式空间:容纳当前输入行的缓冲区: 保持空间:作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间. 由上面定义可以知道,模式空间和保持空间是两个独立的缓冲区,可以进行交互,命 ...
随机推荐
- ElasticSearch 集群监控
要监控哪些 ElasticSearch metrics? Elasticsearch 提供了大量的 Metric,可以帮助您检测到问题的迹象,在遇到节点不可用.out-of-memory.long g ...
- Jfinal启动源码解读
本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口 JF ...
- 0/1背包 dp学习~6
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 I NEED A OFFER! Time Limit: 2000/1000 MS (Java/O ...
- 教你上传本地代码到github转载
原创 2015年07月03日 10:47:13 标签: 上传代码github 转载请标明出处: http://blog.csdn.net/hanhailong726188/article/deta ...
- javascript之fill()方法
无意中看到fill这个方法,有些不解,起初以为是人家自定义的方法,后来才发觉原来不是,javascript里面是真的有这个方法,于是特地学习了下. fill()方法的作用是使用一个固定值来替换数组中的 ...
- vue集成百度UEditor富文本编辑器
在前端开发的项目中.难免会遇到需要在页面上集成一个富文本编辑器.那么.如果你有这个需求.希望可以帮助到你 vue是前端开发者所追捧的框架,简单易上手,但是基于vue的富文本编辑器大多数太过于精简.于是 ...
- php页面zend加密乱码的解决办法
http://www.chinaz.com/program/2008/1021/41485.shtml?qq-pf-to=pcqq.group 今天在服务器部署一个php程序是有zend加密的页面出现 ...
- parse_str() 函数把查询字符串解析到变量中。
定义和用法 parse_str() 函数把查询字符串解析到变量中. 注释:如果未设置 array 参数,则由该函数设置的变量将覆盖已存在的同名变量. 注释:php.ini 文件中的 magic_quo ...
- FileZilla出现Failed to convert command to 8 bit charset
FileZilla这款FTP客户端软件,自从华哥使用以来,采用其默认的设置,一直用得很顺畅,没有出现过什么问题.但是今天碰到了一个问题.如图. 错误信息为:Failed to convert comm ...
- 修真院java后端工程师学习课程--任务1(day one)
这是我从学习资料-线下报名-北京报名截取的报名截图,从图中我们可以看出我们的报名对象应该有姓名,qq,修真类型,预计入学时间,毕业院校,线上学号,日报链接,立愿,辅导师兄等属性,其中线上学号是主码. ...