赞
踩
sed高级用法:模式空间与保持空间
模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间
保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,而是需要sed命令来进行处理
模式空间与保持空间的关系
模式空间:相当于流水线,文本行在模式空间中进行处理;
保持空间:相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。
hold:(H|h)(追加|覆盖)到保持空间
get:(G|g)(追加|覆盖)到模式空间
exchange:(x)空间互换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
h : 把模式空间中的内容覆盖至保持空间中
H : 把模式空间中的内容追加至保持空间中
g : 把保持空间中的内容覆盖至模式空间中
G : 把保持空间中的内容追加至模式空间中
x : 把模式空间中的内容到保持空间中的内容互换,初始保持空间中为空
n : 读取下一行覆盖模式空间中的行
seq 11 | sed ‘n;d’ : 显示结果为1、3、5、7、9、11 ,默认动作先输出模式空间中的行,再覆盖读取下一行,再执行d命令
seq 10 | sed ‘n;d’ : 显示结果为1、3、5、7、9
N : 读取下一行并追加到模式空间中的行后面,使用\n分隔
seq 11 | sed ‘N;d’ : 显示结果为11,默认动作先读取两行,然后执行d操作
seq 10 | sed ‘N;d’ :显示结果为空
D : 删除模式空间中的多行
seq 11 | sed ‘N;D’ : 显示结果为11
{} : 多命令同时执行时,需要使用{}括起来
sed -n ‘/^UUID/{N;p}’ fstab1 : 读取UUID开始的行,再读取下一行并打印模式空间的内容。
理解n与N
1
n : 读取下一行覆盖模式空间中的行
1
N : 读取下一行并追加到模式空间中的行后面,使用\n分隔
1
2
3
[root@master ~]# seq 4 |sed ‘n;d’
1
3
说明:pattern space先读入1,然后执行到n,把下一行2读入pattern space中并覆盖原本的1。然后pattern space中的内容(2)被删除(d操作),所以打印出1\n3
1
2
[root@master ~]# seq 5|sed ‘N;d’
5
说明:pattern space先读入1,然后执行到N,把下一行添加到当前的pattern space中,pattern space内容为1\n2,然后执行d操作被删除。接下去读入3,执行N,pattern space 内容变为3\n4,然后再被删除,就剩下个5
1
2
[root@master ~]# seq 5 |sed -n ‘n’
[root@master ~]# seq 5 |sed -n ‘N’
以上两都不会输出输入,-n参数把模式空间中的内容关闭显示了
1
2
3
[root@master ~]# seq 5 |sed -n ‘n;p’
2
4
说明:-n参数不显示模式空间的内容,说明:模式空间中有1,然后n使用2覆盖1,再p打印,当执行到第5行时,发现没有下一行了,就不执行n了
1
2
3
4
5
[root@master ~]# seq 5 |sed -n ‘N;p’
1
2
3
4
说明:n首先读取1\n2 -->打印模式空间 -->读取3\n4—>打印模式空间—>读取5行发现没有第6行—>失败
理解x:
把模式空间中的内容到保持空间中的内容互换,初始保持空间中为空
1
2
3
4
5
6
[root@master ~]# seq 4 |sed ‘/3/{x;p;x}’
1
2
3
4
说明:当匹配到3的时候,执行交换,现在模式空间为空行,保持空间中为3,执行p命令显示模式空间中的空行,x再交换两这空间的内容,此是模式空间为3,默认模式空间的就会输出至标准屏幕,故3之前多了一个空行
1
2
3
4
5
[root@master ~]# seq 4 |sed ‘/3/{x;p;x;d}’
1
2
4
说明:当第二个x交换回来,直接交给d执行,故3就没有了,只多了一条空行
理解h和H
1
2
h : 把模式空间中的内容覆盖至保持空间中
H : 把模式空间中的内容追加至保持空间
1
2
3
4
5
[root@master ~]# seq 4 |sed ‘h;x’
1
2
3
4
说明:把模式空间中的内容覆盖到保持空间,再交换,再打印至标准输出
1
[root@master ~]# seq 4 |sed ‘x;h’
说明:先把模式空间的与保持空间交换,现在模式空间为空行,保持空间为1,然后再把模式空间覆盖保持空间,再输出至标准输出,故都为空行
1
2
3
4
5
6
7
8
9
[root@master ~]# seq 4 |sed ‘H;x’
1
1
2
2
3
3
4
说明: 把模式空间中的内容(1)追加到保持空间(0+1),再交换,此时模式空间空间为(0+1),保持空间为(1)再打印至标准输出
1
2
3
4
5
6
7
8
9
10
[root@master ~]# seq 4 |sed ‘x;H’
1
2
1
3
2
1
说明: 将模式空间的(1)和保持空间的(0)互换,再将模式空间的(0)追加到保持空间的(1)下 。此时保持空间为(10),模式空间为(0)。再打印标准输出0,以此类推
理解g和G
1
2
g : 把保持空间中的内容覆盖至模式空间中
G : 把保持空间中的内容追加至模式空间中
1
2
3
4
5
[root@master ~]# seq 4 |sed ‘/3/g’
1
2
4
说明:当匹配到3的时候,把保持空间的空行覆盖到模式空间,故就输出了空行
1
2
3
4
5
[root@master ~]# seq 3 | sed ‘1!G’
1
2
3
说明: 不是第1行就执行G操作,G是追加保持空间到模式空间,即为2+空行
1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。