linux模式匹配,sed的模式匹配用法探讨

[root@sunsky Desktop]# cat sunsky

a

b

c

d

e

f

[root@sunsky Desktop]# cat sunsky|sed '1,2d'|sed '1,2d'

e

f

[root@sunsky Desktop]# cat sunsky|sed -e '1,2d' -e '1,2d'

d

e

f

问题:

sed中-e的意思是直接在指令列模式上进行sed的动作编辑按照,那么按照-e的含义,上下两组命令的执行结果应该相同,但是为什么结果不一样呢?

解答:

下面先把两组命令的执行过程列出来给大家看!

第一组命令:

cat sunsky   # 输出了sunsky文本中a-f这6个字母

a

b

c

d

e

f

sed '1,2d'

第一个命令的标准输出变成了第二条命令的标准输入,即cat sunsky输出的a,b,c,d,e,f.在第二条命令执行之后,第一条命令产生的数据流的1,2行删除掉,即删除了a和b,然后输出剩余的行,即c,d,e,f,结果如下:

c

d

e

f

sed '1,2d'

第二个命令的标准输出变成了第三个命令的标准输入,即c,d,e,f,由于对于第三条命令来讲是新的数据流,因此该数据流有新的行号定义,即第一行是字母c,第二行是字母d,第三行是字母e,第四行是字母f.此时,最后一条命令即第三条命令sed '1,2d'会把当前数据流的1,2行删掉,即删除了c和d这两个字母,然后输出剩余的行,即e,f,结果如下:

e

f

第二组命令:

cat sunsky   # 输出了sunsky文本中a-f这6个字母

a

b

c

d

e

f

sed -e '1,2d' -e '1,2d'

该命令会对管道输入的数据流,即a,b,c,d,e,f进行行号定义,即第一行是字母a,第二行是字母b,第三行是字母c直到最后一行字母f。然后执行它的模式操作。在执行模式操作时,由于使用了两个-e,因此会拆分成2步执行,第一步先执行第一个-e '1,2d',第二步执行第二个-e '1,2d'。那么具体执行过程如下:

第一个-e '1,2d'  #它会将1,2行的数据删除,即删除了字母a和字母b

第二个-e '1,2d'  #由于此时剩下的数据为第三行的字母c到最后一行的字母f,此时它去匹配第一行到第二行,显然是匹配不成功的,因为第一行和第二行已经在前一个模式操作时被删掉了。那么此时怎么办呢?

这个就要涉及到模式匹配操作了,由于sed的点到点匹配常用的有4种,详解如下:

一)line1,line2    纯行号匹配,第几行到第几行之间的内容,如果是前面行号匹配不到(过小则默认为当前最小的行号,过大则前后模式匹配操作都放弃),如果是后面行号匹配不到(过小则后面行号匹配操作放弃,仅前面行号匹配操作生效,过大则默认匹配到行尾)

二)/pattern/,/pattern/    纯模式匹配,第一个匹配到的模式到最后一个匹配到的模式之间的内容,如果是前面匹配模式匹配不到则前后模式匹配操作都放弃,如果是后面模式匹配匹配不到,就默认到匹配到行尾

三)/pattern/,line    第一个匹配到的模式到指定的行号之间的内容,如果是前面模式匹配匹配不到则前后模式匹配操作都放弃,如果是后面行号匹配不到(过小则后面行号匹配操作放弃,仅前面模式匹配操作生效,过大则默认匹配到行尾)

四)line,/pattern/    指定的行号到第一个匹配到的模式之间的内容,如果前面行号匹配不到(过小,就默认为当前最小的行号,过大则前后模式匹配操作都放弃),如果后面模式匹配匹配不到,就默认匹配到行尾

因此,按照上面的四种模式匹配的解释,我们这里进行分析

由于经历了第一个-e '1,2d'的操作,第一行和第二行数据已经让删除了,此时仅剩下第三行到最后一行的数据,即c,d,e,f,此时最小行号是第三行。第二个-e '1,2d'操作,该匹配操作很明显是属于纯行号匹配,由于第一行已经没有了,现在最小行是第三行,前面的行号1匹配过小,在纯行号匹配模式下,前面行号匹配过小,则默认为当前最小行号,即第三行。这样子,前面的行号匹配就成功了,接下来进行后面的行号匹配,由于行号2已经在第一个-e '1,2d'的操作中被删除了,因此在纯行号匹配模式下,后面行号匹配过小,则仅前面行号匹配操作生效。因此第二个-e '1,2d'操作的结果就是仅匹配到了第三行的字母c,然后根据操作指令d,将其删除,得到结果如下:

d

e

f

以上就是cat sunsky|sed '1,2d'|sed '1,2d'和cat sunsky|sed -e '1,2d' -e '1,2d'这两组命令执行的不同之处,当然也是该问题的解答。

希望大家能明白,关于sed和awk的使用方法,欢迎大家和我一起交流探讨,共同进步。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qualcomm QXDM工具简介和log抓取

高通工具简介QXDM 简介QXDM 安装QXDM 激活QXDM 使用AT打开Diagnostic口 QXDM 配置1 Message View ConfigurationMessage PacketsLog PacketsLog PacketsOTAEvent ReportsStrings2 Log View Config3 QXDM-保存配置文件4 QXDM-导入配置文件QPST 端口配置QXDM 抓取log QXDM LOG保存…

layout_gravity

layout_gravity——当前View,本身,在父一级的控件所分配的显示范围内的,对齐方式常用在: 当前控件(在父一级LineLayout所分配给其的显示范围内)的对齐方式需要注意的是,如果TableRow的gravity确…

Linux_arm_启动_c语言部分详解,[原创]Linux arm 启动 c语言部分详解第四讲

Linux arm启动c语言部分详解第四讲(from setup_per_cpu_areas();)Written by leeming上面的setup_arch花了我们大量的篇幅,现在我们要继续往前推进了。注:黑色为主线,蓝色为函数的一级展开,红色是注意重要的地方。//因为我们没有定…

Kudu1.1.0 、 Kudu1.2.0 Kudu1.3.0的版本信息异同比较

不多说,直接上干货! Kudu1.1.0 新特性 python API升级,具备JAVA Cclient一样的功能(从0.3版本直接升级到1.1),主要的点如下: 1.1. 改进了Parial Row的语义 1.2. 增加了range partition支持 1.3.…

ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题

刚才忘了说了,在控制器名重名的情况下,特性路由是不生效的。不然的话就可以利用特性路由解决同名的问题了。 而且这种不生效是真的不生效,不会提示任何错误,重名或者什么的,直接会报告404,所以也是个坑。转…

Python3爬取网页信息乱码怎么解决?(更新:已解决)

更新:乱码问题已经解决了。 将下面代码中的红色部分改为下面这样就不会出现个别职位信息乱码的情况了。 soup2 BeautifulSoup(wbdata2, html.parser,from_encoding"GBK") 另外: 建立了一个微信公众号,主要分享软件视频教程、文档笔…

洗衣机洗涤部分c语言程序,51单片机洗衣机控制板及C语言程序

51单片机洗衣机控制板及C语言程序,该控制板单片机采用AT89C51单片机,所设计全自动洗衣机功能有:标准洗衣、经济洗衣、单独洗衣以及排水四种洗衣等四种方式,有强洗、弱洗及运行/暂停、显示及报警功能,程序利用利用Protues仿真软件观…

数据存储

一、NSCoding &#xff1a; 使用NSCoding需要遵守<NSCoding> 保存&#xff1a; /** * 将某个对象写入文件时会调用 * 在这个方法中说清楚哪些属性需要存储 */ MJStudent.m - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.no forKey:"…

犯人释放的C语言程序,C语言的自动关机程序和一个用来整人的小程序

可以用C语言中的system()函数来实现系统的自动关机程序&#xff0c;可以设置多长时间后将自动关机。当然马上关机也是可以的&#xff0c;我们就可以恶搞别人计算机了(你事先得知道怎么解)&#xff0c;将写好的自动关机程序复制到别人电脑&#xff0c;然后将可执行的文件设为开机…

[mysql] linux下使用yum安装mysql

From: http://www.2cto.com/database/201207/141878.html linux下使用yum安装mysql1、安装查看有没有安装过&#xff1a;yum list installed mysql*rpm -qa | grep mysql*查看有没有安装包&#xff1a;yum list mysql*安装mysql客户端&#xff1a;yum install mysql安装mysql 服…

图解MapReduceMapReduce整体流程图

1.图解MapReduceMapReduce整体流程图 并行读取文本中的内容&#xff0c;然后进行MapReduce操作 Map过程&#xff1a;并行读取三行&#xff0c;对读取的单词进行map操作&#xff0c;每个词都以<key,value>形式生成 reduce操作是对map的结果进行排序&#xff0c;合并&#…

阿里云推出CloudDBA,解决数据库性能优化和问题诊断难题

问题诊断(trouble shooting) 和 性能优化(performance tunning) 一直都是数据库领域的专业问题&#xff0c;需要资深DBA的专业技能才能胜任解决&#xff0c;但这样的人才是稀缺的&#xff0c;无法及时满足大部分的企业紧急需求。如果有一款产品能够在大多数情况下&#xff0c;用…

c语言程序设计学生信息管理系统代码,c语言程序设计学生成绩管理系统源代码.pdf...

c语言程序设计 学 生 成 绩 管 理 系 统 源代码#include#include#include#include#define MAX 80int a;typedef struct /*定义结构体数组*/{ char num[10];char name[20];int score;} Student;Student stu[MAX];int menu_select(){char c;do{system("cls");/*清屏*/p…

初探ArrayList之删除

1.返回删除元素的删除方法 public E remove(int index) {rangeCheck(index);modCount;//记录修改次数的变量E oldValue elementData(index);//根据数组下标拿到指定元素int numMoved size - index - 1;//计算移动位数if (numMoved > 0)System.arraycopy(elementData, inde…

UESTC_秋实大哥与花 2015 UESTC Training for Data StructuresProblem B

B - 秋实大哥与花 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status秋实大哥是一个儒雅之人&#xff0c;昼听笙歌夜醉眠&#xff0c;若非月下即花前。 所以秋实大哥精心照料了很多花朵。现在所有的花朵排成了一行&#xff…

java的三大特性,封装,继承,多态

封装 Java代码 /** * 所谓封装&#xff0c;就是将对象具有的成员变量和成员函数包装和隐藏起来&#xff0c;让外界无法直接使用&#xff0c; * 被封装的成员只能通过某些特定的方式才能访问。 * 实现封装有两个步骤&#xff1a; * 1、将不能暴露的成员隐藏起来&#x…

银行家算法实验报告c语言版,银行家算法实验报告C语言版.doc

《操作系统》课程综合性实验报告姓名&#xff1a; 学号&#xff1a; 2016 年 11 月 20 日实验题目进程调度算法程序设计一、实验目的通过对安全性算法和银行家算法的模拟&#xff0c;进一步理解资源分配的基本概念&#xff0c;加深对资源申请&#xff0c;资源分配(银行家算法)以…

GetModuleHandle(NULL)获取当前DLL模块基址?

做一项目想在DLL内部代码实现获取本DLL的模块基址&#xff0c;而且不知道本DLL名称 最简单的方法是想到GetModuleHandle(NULL)&#xff0c;是否可以呢? 参看http://blog.csdn.net/guzhou_diaoke/article/details/8826558到的答案是否 自己尝试了一下: DLL代码(testDll): BOOL …

DataTable是否存在某个列的判断

使用 DataTable.Columns.Contains方法可以判断某个列名是否存在于某个DataTable中 //添加模拟数据 DataTable t new DataTable(); DataColumn col new DataColumn("aaa"); t.Columns.Add(col); col new DataColumn("bbb"); t.Columns.Add(col); col ne…

【评分】第三次作业-团队展示

【评分】第三次作业-团队展示 总结 【2017-10-10】更新&#xff1a; 分数映射至 [1,2] 分 【注意】&#xff1a; 为了保护大家隐私&#xff0c;以后发表博客&#xff1a; 涉及到学号时&#xff0c;仅提供后三位涉及到姓名时&#xff0c;仅提供名&#xff08;省略姓&#xff09;…