Linux之sed模式空间

  • 前言
    sed有两个内置的存储空间:一是 “模式空间”,二是 “保持空间”,这篇主要讲解 “模式空间”,你可能会问为啥不讲 “保持空间” 哪?那是因为我在目前的工作和学习中没有遇到 “保持空间” 的案例,我也找不到什么合适的例子,那就等遇到再学喽!故本文就重点介绍应用于sed “模式空间” 的两个命令Nn
  1. 模式空间的概念
    模式空间:sed工具从文件读取一行文本然后存入的缓冲区,然后命令操作模式空间的内容,在初始状态下模式空间是没有内容的,在每次循环读取数据的过程中,模式空间都会被清空并写入新的内容(这里补充一点,sed命令操作就是 “模式空间” 而不是内存,这就是为什么sed不会改变原文件内容的原因,如果想改变原文件内容需要加-i选项)

  2. sed工具的执行流程图

    24801412821380580.png

  1. 命令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命令,其余行的时候都是正常执行打印操作
  1. 命令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

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

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

你可能感兴趣的:(Linux之sed模式空间)