sed的模式匹配用法探讨

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1405753

[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的使用方法,欢迎大家和我一起交流探讨,共同进步。

转自:http://nolinux.blog.51cto.com/4824967/1405753

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

(0)
s19930811s19930811
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • Linux发展史

    独白:    先来说说我对Linux的认识吧,用一个成语形容:狗屁不通,想了一下,文明社会还是和谐点比较好,算是闻所未闻吧。15年初从朋友那得知Linxu,冲着他那十几K的工资还是挺心动的,说实在很仰慕他,有点计算机基础,自学两个月出山,当时月薪8k;而我还是拿着3,4k的工资,也没什么本领,于是找他要了些有关视频资料,也开始了自学之路,…

    Linux干货 2017-04-08
  • 深入理解java异常处理机制

     1. 引子        try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正…

    Linux干货 2015-04-12
  • 【N25第六周作业】VIM、crontab、简单脚本

    请详细总结vim编辑器的使用并完成以下练习题 第二周有写过vim的用法,请查看连接: 周期性任务计划:cron 服务程序: cronie:主程序包,提供了crond守护进程及相关辅助工具; 确保crond守护进程(daemon)处于运行状态: CentOS 7: systemctl  status  cron…

    Linux干货 2016-12-27
  • linux系统用户管理和grep正则表达式练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@suywien ~]# cp -rpv /etc/skel/ /home/tuser1/ ‘/etc/skel/’ -> ‘/home/tuser1/’ ‘/etc/skel/.mozilla’ ->…

    Linux干货 2018-03-25
  • 第七周作业

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

    2017-04-05
  • 磁盘管理之LVM

    1、什么是LVM     LVM(Logical Volume Manager)逻辑卷管理,是linux环境下将一种将一个或多个硬盘的分区在逻辑上集合来呈现给上层应用,对磁盘实现动态管理的机制。相对于普通的磁盘分区有很大的灵活性,使用LVM在一定程度上就可以解决普通磁盘分区带来的问题。 2、专业术语     &nbsp…

    Linux干货 2016-09-02