linux sed 空间模式,Linux之sed模式空间

本文详细介绍了sed工具的模式空间概念,重点剖析了N和n命令在模式空间中的行为。N命令用于不清空模式空间读取下一行,n则在读完当前行后进行。通过实例演示了如何利用这些命令打印文件的奇偶行和人名性别对应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

sed有两个内置的存储空间:一是 “模式空间”,二是 “保持空间”,这篇主要讲解 “模式空间”,你可能会问为啥不讲 “保持空间” 哪?那是因为我在目前的工作和学习中没有遇到 “保持空间” 的案例,我也找不到什么合适的例子,那就等遇到再学喽!故本文就重点介绍应用于sed “模式空间” 的两个命令N和n

模式空间的概念

模式空间:sed工具从文件读取一行文本然后存入的缓冲区,然后命令操作模式空间的内容,在初始状态下模式空间是没有内容的,在每次循环读取数据的过程中,模式空间都会被清空并写入新的内容(这里补充一点,sed命令操作就是 “模式空间” 而不是内存,这就是为什么sed不会改变原文件内容的原因,如果想改变原文件内容需要加-i选项)

sed工具的执行流程图

f3797c80c5aa?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

24801412821380580.png

命令n

清空当前模式空间,然后读入下一行(如果sed语句遇到n命令会改变正常的执行流程),执行流程如下:

f3797c80c5aa?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

657782432329429924.png

代码示例(无论是n还是N命令都不要用多少多少行的思维来思考,sed语句是循环读取文件的,应该用循环的思维来思考问题)

(1)使用sed命令打印文件内容

etl@bejedw09:/home/etl/cya_2/as/one> sed -n "p" test

0001

0002

0003

0004

0005

0006

0007

0008

(2)使用n命令

etl@bejedw09:/home/etl/cya_2/as/one> sed -n "n;p" test

0002

0004

0006

0008

结合上面流程图解释sed -n "n;p" test这条命令:

第一次循环,sed语句读入第一行,跳过,读入第二行,打印输出,

第二次循环,sed语句读入第三行,跳过,读入第四行,打印输出,

第三次循环,sed语句读入第五行,跳过,读入第六行,打印输出,

第四次循环,sed语句读入第七行,跳过,读入第八行,打印输出,

所以才会变成打印出文件的偶数行,打印文件的奇数行是sed -n "p;n" test,这里还是很有必要解释下打印奇数行的这条命令,首先是p命令打印文件第一行,然后是n命令在模式空间内删除第一行,读入第二行,注意现在模式空间内存在的是文件的第二行数据,但是sed语句本次循环已经执行完毕,进入第二次循环,在第二次循环开始时清空模式空间,然后读入文件第三行,然后打印文件第三行,然后以此类推......,所以才会打印文件的奇数行,更多关于打印文件奇偶行的操作请关注我的另一篇文章 《 Linux之awk三元运算符和打印奇偶行 》

再看下一段代码

etl@bejedw09:/home/etl/cya_2/as/one> sed -n "2n;p" test

0001

0003

0004

0005

0006

0007

0008

#在循环到文件第二行的时候跳过然后读入第三行打印,后面的依次打印,因为2n代表的是在读入文件

#第二行的时候才执行n命令,其余行的时候都是正常执行打印操作

命令N

不清空当前模式空间,然后读入下一行,以\n分隔两行(如果sed语句遇到N命令会改变正常的执行流程),执行流程如下:

f3797c80c5aa?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

112318452027417218.png

关于N命令结合一个需求给大家演示一个例子

etl@bejedw09:/home/etl/cya_2/as/one> cat test

Bob

man

Alice

woman

Peter

man

Julie

woman

#这段文本,奇数行是人名,偶数行是性别,需求是将人名和对应的性别打印在一行,中间用"--"隔开

(1)N命令一

etl@bejedw09:/home/etl/cya_2/as/one> cat test | sed -n "N;p"

Bob

man

Alice

woman

Peter

man

Julie

woman

(2)N命令二

etl@bejedw09:/home/etl/cya_2/as/one> cat test | sed -n "N;s/\n/--/;p"

Bob--man

Alice--woman

Peter--man

Julie--woman

在这里解释下上面的两条命令,我相信聪明的小伙伴看到这里已经看出端倪了吧^_^,那就是我上面提到过的N命令的特点不清空当前模式空间,然后读入下一行,以\n分隔两行所以在循环读取文件时模式空间中存储的内容分别是:

Bob\nman

Alice\nwoman

Peter\nman

Julie\nwoman

所以使用sed的s命令(替换命令),将\n替换成--就可以完成需求

结尾

本文主要讲解sed命令的 “模式空间” 并介绍了两个命令N、n,由于本文的内容有些抽象,不过篇幅太长会影响大家的阅读感,所以本文就不在这里啰嗦了,如果看到本文且有不明白的地方,欢迎大家留言提问!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值