打开高效文本编辑之门_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之模式空间与保留空间的主要内容,如果未能解决你的问题,请参考以下文章

打开高效文本编辑之门_调用Linux的sed命令

打开高效文本编辑之门_Linux Sed模拟常见文件命令

打开高效文本编辑之门_熟悉Linux Sed的替换命令

打开高效文本编辑之门_Linux Sed插入追加转换退出等命令应用

打开高效文本编辑之门_Linux awk之关联数组

打开高效文本编辑之门_Linux Awk之条件判断与循环