2.2.3 高阶用法1

学习目标

这一节,我们从 基础知识、缓存实践、小结 三个方面来学习。

基础知识

简介

对于sed命令来说,除了我们经常使用的模式空间之外,它还支持一个叫暂存空间(Hold Space)的模式,所谓的暂存空间,也就是说,将模式空间中的数据,临时保存到暂存空间,从而实现更为强大的功能。
	相关业务逻辑流程如下:

课时114:sed命令_进阶实践_高阶用法1_linux

空间解读:
	缓存空间用于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个扩容 一共三个空间内容