[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

linux模式匹配,sed的模式匹配用法探讨相关推荐

  1. linux中sed的基本用法,linux sed用法

    一.定义 sed 流编辑器,每次从输入中读取一行,用提供的编辑器命令匹配数据.按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT,在流编辑器将所 有命令与一行数据进行匹配后,它会读取 ...

  2. linux教程 sed命令的用法,Linux基础教程之文件三剑客sed命令用法详解

    sed是一种流编辑器,它是文本处理中非常强大的工具,能够完美的配合正则表达式使用,用法简单实用,非常灵活. 工作原理:sed命令处理文本时,把当前处理的行存储在一个临时缓冲区中,称为"模式空 ...

  3. linux之sed命令的用法

    2019独角兽企业重金招聘Python工程师标准>>> sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作 ...

  4. Linux下Sed命令的用法(之替换)

    Linux 操作系统最大的一个好处是它带有各种各样的实用工具.存在如此之多不同的实用工具,几乎不可能知道并了解所有这些工具.可以简化关键情况下操作的一个实用 工具是 sed.它是任何管理员的工具包中最 ...

  5. linux中sed的基本用法,linux中sed的常用方法.md

    基本用法: sed是流编辑器,stream editor可以实现对文件的增删改查 1.增 a 追加内容 i 插入内容 例如: sed -i '2a 123' test.log 追加123到test.l ...

  6. linux教程 sed命令的用法,Linux文本处理三剑客——sed命令使用教程

    SED是一种流编辑器工具,可以根据设置的匹配条件对文件内容进行处理,支持正则表达式.sed每次处理一行数据,和awk处理流程是一样的. sed命令格式: sed [options] '/pattern ...

  7. Linux sed命令高级用法精讲

    <Linux sed用法详解>一节给大家介绍了如何用 sed 命令的基本功能处理文本中的数据,所涵盖的知识点,可以满足日常大多数文本编辑需求.本节将介绍 sed 提供的一些高级功能,这些功 ...

  8. linux中替换命令详解,linux中sed命令字符串替换的用法详解

    Linux系统中sed命令可以将字符串批量替换,省去了很多麻烦,下面由学习啦小编为大家整理了linux系统中sed命令字符串替换的用法详解,希望对大家有帮助! linux中sed命令字符串替换的用法详 ...

  9. linux 之sed命令详解

    sed命令详解 sed是什么 sed是linux文本处理三剑客之一,全称 StreamEDitor,非常著名的行编辑器,功能十分强大. sed的工作过程 sed处理文本时每次从文件复制出来一行,放在工 ...

最新文章

  1. K-近邻算法之交叉验证,网格搜索
  2. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列
  3. ajax实现向上正在加载,向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)
  4. 湖南工商大学计算机网络原理,李小龙(湖南工商大学计算机与信息工程学院副院长)_百度百科...
  5. python扫雷脚本_Python自动扫雷实现方法
  6. dos2unix,unix2dos
  7. Thinking in Java 11.13.1适配器方法惯用法
  8. 用.net动态创建类的实例 (转)
  9. 针对利用tzselect修改时间及ln -sf 修改系统时间不好使的情况 linux 6.5
  10. HarmonyOS USB DDK助你轻松实现USB驱动开发
  11. Python numpy.ones_like函数方法的使用
  12. 使用canvas 画钟表
  13. 生物计算机 量子计算机,光子计算机、生物计算机和量子计算机
  14. GIT修改用户名——idea提交git用户名/名字不正确
  15. UnknownHostException: xxx异常
  16. 游戏外挂防封心得防检测防封技术
  17. maskrcnn_benchmark 代码详解之 boxlist_ops.py
  18. appium自动化获取app的appPackage与appActivity方法总结
  19. 三星30pin引脚_led屏接口定义20PIN-30PIN
  20. 扫描版PDF文件,如何弄成可复制的文字版?

热门文章

  1. 【总有一些东西要弄清】——说说面试时一系列的CSS问题
  2. [转 TDD] 如何坚持TDD:使用者出现的问题以及解决方案
  3. maskView与CAGradientLayer详解
  4. 原生js来实现对dom元素class的操作方法
  5. 递归实现 十进制转换其他进制(2-16)
  6. Week1 Team Homework #2 Introduction of team member with photos
  7. jQuery以Post方式发送请求并获取返回的文件供下载!
  8. 训练(线段树+树状数组) poj——3264
  9. node --- [express] cookie/session 机制与 中间件的使用(路由守卫)
  10. NDK 开发实战 - 封装 java 层 sdk 模型