sed的模式匹配用法探讨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[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的使用方法,欢迎大家和我一起交流探讨,共同进步。
sed的模式匹配用法探讨相关推荐
- linux模式匹配,sed的模式匹配用法探讨
[root@sunsky Desktop]# cat sunsky a b c d e f [root@sunsky Desktop]# cat sunsky|sed '1,2d'|sed '1,2d ...
- OpenCV中cvAdds和cvAdd中的mask的用法探讨
OpenCV中cvAdds和cvAdd中的mask的用法探讨 Fn : 包含 mask 参数的一些函数如下 [摘自opencv 2.3.1版本 C++] void add(InputArray src ...
- Linux sed命令高级用法精讲
<Linux sed用法详解>一节给大家介绍了如何用 sed 命令的基本功能处理文本中的数据,所涵盖的知识点,可以满足日常大多数文本编辑需求.本节将介绍 sed 提供的一些高级功能,这些功 ...
- linux中sed的基本用法,linux sed用法
一.定义 sed 流编辑器,每次从输入中读取一行,用提供的编辑器命令匹配数据.按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT,在流编辑器将所 有命令与一行数据进行匹配后,它会读取 ...
- linux sed命令的用法
sed基本用法: sed: Stream EDitor 行编辑器 (全屏编辑器: vi) sed: 模式空间 默认不编辑原文件,仅对模式空间中的数据做处理:而后,处理结束后,将模式空间打印至屏幕: ...
- linux教程 sed命令的用法,Linux基础教程之文件三剑客sed命令用法详解
sed是一种流编辑器,它是文本处理中非常强大的工具,能够完美的配合正则表达式使用,用法简单实用,非常灵活. 工作原理:sed命令处理文本时,把当前处理的行存储在一个临时缓冲区中,称为"模式空 ...
- sed个人习惯用法总结
我这个是根据个人习惯做的笔记,一般常用的我就不记了,记一些爱忘记的!!! sed -[nerif] '行号,行号 action/str/str/action' file (/,@,#都是前面所说的地址 ...
- sed 以及 awk用法
sed 格式 sed[options] "script" FILE.... 选项: -n:静默模式,不输出模式空间内的内容:默认打印空间模式的内容 -r:扩展的正则表达式 -f 文 ...
- Linux文本处理sed命令高级用法
sed 工作原理 sed 即 Stream EDitor,和 vi 不同,sed是基于行的文本编辑器 Sed是从文件或管道中读取一行,处理一行,输出一行:再读取一行,再处理一行,再输出一行,直到最后一 ...
最新文章
- MySQL 5.6.26 Release Note解读
- [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
- Oracle Study案例之--基于表空间的时间点恢复(TSPITR)
- 深入剖析C#继承机制
- 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
- ttribute value is quoted with which must be escaped when used within the value
- devops 文化_需要建立DevOps文化
- 厉害了,2019-2020中国互联网趋势报告
- Sklearn的聚类算法以及聚类评价指标
- java replace三个参数_javascript replace()第二个参数为函数时的参数用法
- c语言实现ftp客户端,下载ftp的文件内容信息
- 桌面计算机怎么显示桌面快捷方式,桌面快捷方式不见了,小编教你桌面快捷方式不见了怎么找回...
- 伪随机数的爆破--2
- coreldraw2021全名和序列号 cdr2021安装下载图文教程
- HTML meta标签使用介绍
- docker编配和服务发现
- DFS(深度优先搜索)和BFS(广度优先搜索)求迷宫路径问题的总结
- math的用法在java中的使用,Java Math cbrt() 使用方法及示例
- 境内股指期货品种、合约类型和周期规律简介
- d作者d语言中组件式编程