2.2.4 高阶用法2
学习目标
这一节,我们从 暂存实践、其他实践、小结 三个方面来学习。
暂存实践
简介
我们可以在缓存空间和暂存空间中进行数据的简单读取,还可以对数据进行一些复杂性的编辑操作
常见的高阶命令
P 打印模式空间开端至\n内容,并追加到默认输出之前
h 把模式空间中的内容覆盖至暂存空间中
H 把模式空间中的内容追加至暂存空间中
g 从暂存空间取出数据覆盖至模式空间
G 从暂存空间取出内容追加至模式空间
x 把模式空间中的内容与暂存空间中的内容进行互换
实践1-暂存空间基本实践
获取指定内容信息
[root@localhost ~]# seq 4 > seq.txt
[root@localhost ~]# cat -e seq.txt
1$
2$
3$
4$
结果显示;
每一行后面都有换行符号$
h 把模式空间中的内容覆盖至暂存空间中 G 从暂存空间取出内容追加至模式空间
[root@localhost ~]# sed -e '/2/h' -e '$G' seq.txt
1
2
3
4
2
解读:
/2/h 将匹配到的内容存储到 暂存空间
$ 正常信息输出的时候,不输出暂存空间的信息
G 代表信息操作完毕后,将暂存区的内容,追加到模式空间
取消$,每次输出信息的时候,同时输出缓存区和暂存区的内容
[root@localhost ~]# sed -e '/2/h' -e 'G' seq.txt
1
# 此时暂存区为空
2
2 # 此时暂存区内容为2
3
2 # 此时暂存区内容为2
4
2 # 此时暂存区内容为2
结果显示:
每次输出信息的时候,都会输出暂存区信息
numG 代表仅在num位置输出暂存区信息
[root@localhost ~]# sed -e '/2/h' -e '1G' seq4.txt
1
# 在第1个位置输出暂存区信息
2
3
4
num1,num2G 代表仅在num1-num2范围的位置输出暂存区信息
[root@localhost ~]# sed -e '/2/h' -e '1,2G' seq4.txt
1
# 在第1个位置输出暂存区信息
2
2 # 在第2个位置输出暂存区信息
3
4
num!G 代表在num之外的位置输出暂存区信息
[root@localhost ~]# sed -e '/2/h' -e '1!G' seq4.txt
1
2
2
3
2
4
2
实践2-暂存区使用后,清理模式空间内容
查看文件内容
[root@localhost ~]# cat -e seq.txt
1$
2$
3$
将匹配的内容转移至暂存区,然后清理模式空间
[root@localhost ~]# sed -e '/2/{h;d}' -e 'G' seq.txt
1
# 此时暂存区为空
3 # 缓存区被清理,所以没有输出2
2
4
2
实践3-暂存区使用后,处理清理模式空间内容,
将匹配的内容转移至暂存区,然后清理模式空间,接着将暂存区信息输出到特定的位置
[root@localhost ~]# sed -e '/2/{h;d}' -e '/3/{G;}' seq4.txt
1
3
2
4
解读:
暂存区的信息在/3/后面显示
-e '/3/{G;}' 可以简写为 -e '/3/G'
g 从保持空间取出数据覆盖至模式空间
[root@localhost ~]# sed -e '/2/{h;d}' -e '/3/g' seq4.txt
1
2
4
解读:
g 的作用,是将/3/匹配到的缓存区内容被暂存区的信息覆盖,则缓存区内容是2
x 把模式空间中的内容与暂存空间中的内容进行互换
[root@localhost ~]# sed -e '/2/{h;d}' -e '/3/{x;G}' seq4.txt
1
2 # 缓存区的3被暂存区的2替换了
3 # 暂存区的2被缓存区的3替换了
4
解读:
x 的作用,是将/3/匹配到的缓存区内容和暂存区的信息交换,则缓存区内容是2,暂存区是3
其他实践
实践1-内容倒序实践
查看文件内容
[root@localhost ~]# cat seq.txt
1
2
3
4
除了第1行不输出暂存区,其他都输出暂存区值
[root@localhost ~]# sed -e '1!G' seq.txt
1
2
# 第2处位置的暂存区为空
3
# 第3处位置的暂存区为空
4
# 第4处位置的暂存区为空
h将所有模式空间的内容覆盖到暂存区
[root@localhost ~]# sed -e '1!G;h' seq.txt
1 # 暂存区在第1处缓存区不输出
----
2 # 缓存空间的1覆盖暂存区,然后在当前缓存区的2之后输出--追加
1
---
3 # 缓存空间的21覆盖暂存区,然后在当前缓存区的3之后输出--追加
2
1
---
4 # 缓存空间的321覆盖暂存区,然后在当前缓存区的4之后输出--追加
3
2
1
$!d 代表除了最后一个位置内容不删除,其他的都清除掉
[root@localhost ~]# sed -e '1!G;h;$!d' seq.txt
4
3
2
1
实践2-提取关键信息的前一行
查看文件内容
[root@localhost ~]# cat seq4.txt
1
2
3
4
除了第1行不被暂存区覆盖,其他缓存区被暂存区覆盖
[root@localhost ~]# sed -e '1!g' seq4.txt
1
# 第2处位置被暂存区的空覆盖
# 第3处位置被暂存区的空覆盖
# 第4处位置被暂存区的空覆盖
将匹配到的3不打印,存放到暂存区,然后仅输出缓存区信息
[root@localhost ~]# sed -n '/3/!p;h' seq4.txt
1
2
4
解读:
/3/ 匹配到第3行的内容3,使用!p不输出,然后依次将缓存区内容覆盖暂存区
最终输出的时候仅有一个区显示,另一个区为空
[root@localhost ~]# sed -n '/3/g;p;h' seq4.txt
1 # 条件不匹配,交给h动作,缓存区的1会覆盖到暂存区
2 # 条件不匹配,交给h动作,缓存区的2会覆盖到暂存区
2 # 条件不匹配,交给h动作,暂存区的2通过g覆盖缓存区的3,所以输出2
4
{} 是shell中的一种独立区域,所做操作会直接影响当前的shell环境
[root@localhost ~]# sed -n '/3/{g;p};h' seq4.txt
2
{g;p} 代表直接将暂存区域的数据2覆盖缓存空间,由于{} 直接作用于shell环境
所以p输出的时候,暂存区没有信息,缓存区域有2,仅仅输出2
小结