课时115:sed命令_进阶实践_高阶用法2

发布于:2024-05-05 ⋅ 阅读:(24) ⋅ 点赞:(0)

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

小结



网站公告

今日签到

点亮在社区的每一天
去签到