- 前言
sed
有两个内置的存储空间:一是 “模式空间”,二是 “保持空间”,这篇主要讲解 “模式空间”,你可能会问为啥不讲 “保持空间” 哪?那是因为我在目前的工作和学习中没有遇到 “保持空间” 的案例,我也找不到什么合适的例子,那就等遇到再学喽!故本文就重点介绍应用于sed
“模式空间” 的两个命令N
和n
模式空间的概念
模式空间:sed
工具从文件读取一行文本然后存入的缓冲区,然后命令操作模式空间的内容,在初始状态下模式空间是没有内容的,在每次循环读取数据的过程中,模式空间都会被清空并写入新的内容(这里补充一点,sed
命令操作就是 “模式空间” 而不是内存,这就是为什么sed
不会改变原文件内容的原因,如果想改变原文件内容需要加-i
选项)-
sed
工具的执行流程图
24801412821380580.png
- 命令
n
清空当前模式空间,然后读入下一行(如果sed
语句遇到n
命令会改变正常的执行流程),执行流程如下:
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
命令会改变正常的执行流程),执行流程如下:
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
,由于本文的内容有些抽象,不过篇幅太长会影响大家的阅读感,所以本文就不在这里啰嗦了,如果看到本文且有不明白的地方,欢迎大家留言提问!