打开高效文本编辑之门_Linux sed之模式空间与保留空间
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打开高效文本编辑之门_Linux sed之模式空间与保留空间相关的知识,希望对你有一定的参考价值。
Linux sed之模式空间保留空间使用案例
声明与简介
- sed:Stream Editor文本流编辑器,sed是一个“非交互式的”面向字符流的编辑器。本文主要结合数据以案例形式介绍怎样使用保持空间、模式空间。比较形象的比喻:模式空间似加工区而保持区似仓库区。
- 模式空间(pattern space): sed执行流程里比较常见的部分,它是存放、修改来自文件内容的sed缓存区。
- 保持空间(hold space):sed用来保持临时数据的额外缓存区。我们可以在模式空间和保持空间内来回移动数据,但不能在保持空间里执行常见的命令。
- 对比:模式空间在sed的执行周期内自动清除,而保持空间则不会清除。
数据说明
如下是使用的示例文本 emp_2line.txt的数据,每个记录对应2行,比如Tom的职位是ceo。
Tom
ceo
Jim
manager
Jack
salesman
Kate
manager
Luke
developer
Nancy
tester
Lily
hr
John
tester
模式空间与保持空间
awk里交换空间和模式空间的使用。
x命令
这里的x命令即Exchange是交换模式空间和保持空间的内容,它需要结合其它命令才彰显威力。
x命令的简单例子:如果第一行在模式空间,第二行在保持空间,你们通过x命令得到的效果是第一行是保持空间,第二行在模式空间。
交换模式空间与保持空间隔行匹配
# 打印职位是manager(经理)的员工名
sed -n -e 'x;n' -e '/manager/{x;p}' emp_2line.txt
# 结果
Jim
Kate
# 原始数据(部分)
Jim
manager
Jack
salesman
Kate
manager
# 过程详解
# Step1: 'x;n',这里x是将模式空间交换到保持空间,n读取模式空间的下一行。这时达到的效果是将当前行保存到保持空间,将下一行读到模式空间内。(即实现了奇数行和偶数行的分离,员工职位读取到模式空间、员工名称读取到保持空间)
# Step2: '/manager/{x;p}' 如果模式空间里含有关键字manager,则将保持空间切换到模式空间,并打印出模式空间的内容(即员工职位)。
# 形象版 1:这里x;n像一个绳一样将原始文件相邻的奇数和偶数行做了关联,通过交换后奇数行在保持空间,偶数行在模式空间。以为sed的模式空间处理流程是一行一行的进行,处理完即清空。
# 2: 此时再通过模式空间里匹配关键字,那么对应保持空间里的内容在交换到模式空间。然后打印出来。
#注: 1 这里加了-n,即只显示受影响的行。
#2 针对数据错行的情况(即类似key和value分别对应两行)
h命令
h(hold缩写)命令是拷贝模式空间到保持空间,它不会改变模式空间的内容,这与x命令是明显不同的。而保持空间里的内容则会被模式空间里的覆盖。
h命令的简单例子:如果第一行在模式空间,第二行在保持空间,你们通过h命令得到的效果是保持空间为第一行,模式空间仍在第一行。
拷贝交换模式空间到保持空间
# 输出职位是manager的员工的名称(以拷贝方式)
sed -n -e '/manager/!h' -e '/manager/{x;p}' emp_2line.txt
# 结果
Jim
Kate
# 过程详解
# Step1 如果模式空间里不包含关键字manager的内容拷贝到保持空间。换句话说这里是把员工名词和员工职位不含manager的行拷贝到保持空间。
# Step2 如果模式里有能匹配到manager的则交换模式空间里的对应内容并打印出来。
#注: 1 这里通过!(即反向匹配,不满足条件)
#2 这里没有加N参数,而是走sed正常的执行流程。
#3 其中Step1对应代码'/manager/!h'、Step2对应代码'/manager/{x;p}'。
#4 个人理解'/manager/{x;p}'会产生一个匹配行上一行的链接。
H命令
大写的H命令是将模式空间在保持空间里追加新的行。也就是说保持空间之前的内容不会被覆盖,而是追加。
H命令的简单例子:如果第一行在模式空间,第二行在保持空间,你们通过H命令得到的效果是模式空间仍是第一行,保持空间变成“第二行\\n第一行”,
追加模式空间到保持空间
#将匹配到manager的行的上下行都打印出来。
sed -n -e '/manager/!h' -e '/manager/{H;x;p}' emp_2line.txt
# 执行结果
Jim
manager
Kate
Manager
# Step1 如果模式空间里不包含关键字manager的内容拷贝到保持空间。换句话说这里是把员工名词和员工职位不含manager的行拷贝到保持空间。
# Step2 如果模式里有能匹配到manager,那么H命令会往保持空间里追新行。这里即将关键字含manager的员工名和员工职位追加到保持空间里。同样的,这里的x是交换保持空间和模式空间里的内容,p则是打印出来。
#注:特别的,如果想把员工名和员工职位在一行打印出来,则需要结合字符串替换(将\\n替换为空字符串)。
sed -n -e '/manager/!h' -e '/manager/{H;x;s/\\n/,/;p}' emp_2line.txt
#结果
Jim,manager
Kate,manager
g命令
拷贝保持空间到模式空间
g命令对应get即从保持空间拿回内容到模式空间。
g命令的简单例子:如果第一行在模式空间,第二行在保持空间,你们通过h命令得到的效果是模式空间变成在第二行,保持空间仍是第二行,
# 打印员工的名称
sed -n -e '/manager/!h' -e '/manager/{g;p}' emp_2line.txt
# 结果
Jim
Kate
#过程详解:
# Step1 如果模式空间里不包含关键字manager的内容拷贝到保持空间。换句话说这里是把员工名词和员工职位不含manager的行拷贝到保持空间。
# Step2 从保持空间里拿出内容到模式空间然后再打印出来。
G命令
追加保持空间到模式空间
大写的G命令是将保持空间里模式空间追加新的行。也就是说模式空间之前的内容不会被覆盖,而是追加。
G命令的简单例子:如果第一行在模式空间,第二行在保持空间,你们通过G命令得到的效果是模式空间变成在”第一行\\n第二行”,保持空间仍是第二行,
# 打印员工名称和职位,以逗号分割”;“
sed -n -e '/manager/!h' -e '/manager/{x;G;s/\\n/,/;p'} emp_2line.txt
#结果
Jim,manager
Kate,manager
#过程详解
# Step1 如果模式空间里不包含关键字manager的内容拷贝到保持空间。换句话说这里是把员工名词和员工职位不含manager的行拷贝到保持空间。
# Step2 这里x是交换保持空间和模式空间的内容,结果是员工名在模式空间,员工职位在保持空间。G命令是将保持空间的内容(匹配到关键字manager)追加到模式空间,所以结果是员工名称\\n员工职位。s则是将换行替换为了逗号”,”。
注: 如果打印时员工名称和职位互换位置,则需要仅写G在。
sed -n -e '/manager/!h' -e '/manager/{G;s/\\n/,/;p'} emp_2line.txt
#结果
manager,Jim
manager,Kate
以上是关于打开高效文本编辑之门_Linux sed之模式空间与保留空间的主要内容,如果未能解决你的问题,请参考以下文章