2.2.3 高阶用法1
学习目标
这一节,我们从 基础知识、缓存实践、小结 三个方面来学习。
基础知识
简介
对于sed命令来说,除了我们经常使用的模式空间之外,它还支持一个叫暂存空间(Hold Space)的模式,所谓的暂存空间,也就是说,将模式空间中的数据,临时保存到暂存空间,从而实现更为强大的功能。
相关业务逻辑流程如下:
空间解读:
缓存空间用于sed的内容模式匹配,一般称为模式空间
- 模式空间内的信息可以输出到终端界面,除非模式空间的内容被删除或取消打印导致模式空间清空
附加于缓存空间的附加缓存空间,一般称为暂存空间
- 通过相关命令可以在模式空间信息清零之前,暂存到附加缓存空间,便于后续使用
两个空间之间,可以基于一些高阶命令实现信息的传递
常见的高阶命令
n 读取匹配到的行的下一行覆盖至模式空间
N 读取匹配到的行的下一行追加至模式空间
d 删除模式空间中的行
D 如果模式空间包含换行符,则循环删除换行符前的内容,直至不包含任何换行符后,执行后续d操作
简单实践
实践1-模式空间覆盖
查看逐行读取的信息
[root@localhost ~]# seq 6 | sed -n "p"
1
2
3
4
5
6
n 读取匹配到的行的下一行覆盖至模式空间
[root@localhost ~]# seq 6 | sed -n "n;p"
2
4
6
解读:
第一次读的是1,"n;"的作用是读取2,然后覆盖模式空间的1
2次n代表读取到第3行,将前的内容覆盖
[root@localhost ~]# seq 6 | sed -n "n;n;p"
3
6
3次n代表读取到第4行,将前面的内容覆盖
[root@localhost ~]# seq 6 | sed -n "n;n;n;p"
4
获取匹配内容的下一行,覆盖匹配的内容
[root@localhost ~]# seq 6 | sed -n "/3/{n;p}"
4
解读:
/3/ 代表的是匹配的3内容,然后{} 代表一个表达式区域,n;p 代表下一行覆盖式打印
实践2-模式空间清零
n 读取匹配到的行的下一行覆盖至模式空间
[root@localhost ~]# seq 6 | sed -n "n;p"
2
4
6
解读:
第一次读的是1,"n;"的作用是读取2,然后覆盖模式空间的1
d 删除模式空间中的行
[root@localhost ~]# seq 6 | sed -n "n;d"
[root@localhost ~]#
解读:
n每覆盖一次,都用d删除一次,最终导致不会输出任何内容
实践3-模式空间扩容
查看默认的信息输出
[root@localhost ~]# seq 6
1
2
3
4
5
6
N 读取匹配到的行的下一行追加至模式空间
[root@localhost ~]# seq 6 | sed 'N;s/\n//'
12
34
56
解读:
第一次读的是1,"N;"的作用是读取2,然后追加到模式空间的1的后面
然后使用s将换行\n替换为空,实现1和2的合并
通过-e,多一个N,就相当于为模式空间扩容了一个位置
[root@localhost ~]# seq 6 | sed -e 'N;s/\n//' -e 'N;s/\n//'
123
456
可以看到:
1个空间+2个扩容 一共三个空间内容
小结