文本处理三剑客之sed

概述

    经过上篇对正则表达式和grep相关内容的学习,我们对文本处理有了一个初步的认识,本篇将简要介绍一下文本处理三剑客之sed。具体分为以下几个部分:

    1、sed原理概述

    2、sed命令详解

第一部分    sed原理概述

    1、sed是什么

        sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,如果有需要进一步处理,就把模式空间的内容送到保持空间,如果不需要进一步处理,把模式空间的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或者使用-i选项指定修改原文件。 sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

    2、sed的模式空间和保持空间的理解

        模式空间和保持空间,实际上就是sed用来完成数据处理的两段内存空间,其中模式空间用来存储从文档中读取出来的数据,根据指定的处理动作完成对数据的处理,如果在模式空间的数据一次处理后,无法满足要求或需要后续的行进行配合处理,就需再将该行数据放到保持空间,根据需要从模式空间和保持空间之间调度数据,完成更高一级的文件处理动作

    3、sed工作原理

    sed工作原理.png

第二部分    sed命令详解

    1、sed命令语法格式:

        语法:sed [OPTION]…'SCRIPT' FILE…

        SCRIPT:地址定界和编辑命令的集合

        常用选项:

            -n  不输出模式空间的内容至屏幕,也就是没被模式匹配到的行,不输出到屏幕(不指定的话,默认是输出到屏幕)

                一般如果编辑命令不是d,都应该指明该选项

            -e SCRIPT  可以实现多个SCRIPT一起编辑(默认只能用一个SCRIPT)

            -f /PATH/TO/FILE  将各个SCRIPT写到文件中,然后利用-f 导入sed,进行处理。该文件中的格式为每行一个编辑命令

            -r  表示支持使用扩展正则表达式

            -i  表示直接编辑原文件

                sed –iSTRING ‘s/dog/cat/g’ pets可以实现在改变原文件时,将原文件备份一份到原文件目录下取名为源文件名后跟指定的STRING为文件名的文件

            blob.png

    2、sed中的地址定界

        <1>空地址:表示对全文处理

        <2>单地址:表示只对指定行进行处理

            数字:表示指定的行

            /PATTERN/:表示被此模式匹配到的每一行

            $  最后一行

        <3>地址范围

            数字1,数字2  表示从第几行到第几行之间所有的行,包括数字指定的行本身

            数字1,+数字2  表示从第几行开始,往后的多少行

            数字,/PATTERN/  表示从第几行开始,到第一次能被模式匹配到的行结束

            /PATTERN1/,/PATTERN2/  表示第一次能被模式1匹配到的行开始,到第一次能被模式2匹配到的行结束

        <4>步进长度表示法:~

            1~2:表示从第1行开始,每次步进2(此例子表示的是奇数行)

            2~2:表示从第2行开始,每次步进2(此例子表示的是偶数行)

       

        地址定界示例:

        blob.png

        blob.png

    3、sed中的编辑命令

        d  表示删除(此命令一般不能加-n选项,除此命令之外的其他命令都应该加上-n选项)

        p  显示能够被匹配到的模式空间的内容(一般要加上-n选项)

             例如:sed ‘1~2p’ /etc/fstab

                 表示显示全部的内容,且奇数行显示两次,因为默认会显示模式空间中的内容

                 sed -n ‘1~2p’ /etc/fstab表示只显示奇数行的内容

        a  \TEXT 加在后面,表示在模式匹配到行后面追加指定的文本TEXT,支持使用\n(换行符)实现多行插入

        i  \TEXT 加在前面,表示在模式匹配到行前面加上指定的文本TEXT,支持使用\n(换行符)实现多行插入

        c  \TEXT 把匹配到的整行,替换为此处指定的文本TEXT

        w  /PATH/TO/FILE   保存模式空间中被模式匹配到的行另存为指定文件

        r  /PATH/TO/FILE   读取指定文件的内容,至当前文件中被模式匹配到的行后面,文件合并

        =   为模式匹配到的行,打印行号,在匹配到的行的上方另起一行标注行号

        !  条件取反,!的位置在地址定界之后,编辑命令之前

        s///   查找替换,其分隔符可执行指定,常用的有s@@@,s###

            支持替换标记:

                g  表示全局替换(默认表示只替换第一次出现的地方)

                w  /PATH/TO/FILE  将替换成成功的结果保存至指定文件

                p  显示替换成功的行

        blob.png 

        blob.png

        blob.png

        blob.png

    4、sed中的高级编辑命令

        h  表示把模式空间中的内容覆盖至保持空间中

        H  表示把模式空间中的内容追加至保持空间中

        g  表示把保持空间中的内容覆盖至模式空间中

        G  表示把保持空间中的内容追加至模式空间中

        x  表示把模式空间中的内容与保持空间中的内容互换

        n  表示读取匹配到的行的下一行至模式空间中,覆盖原行

        N  表示读取匹配到的行的下一行至模式空间中,追加到原行后面

        d  表示删除模式空间中的行

        D  表示删除多行模式空间中的所有行

        示例:sed ‘1!G;h;$!d’ /etc/fstab  相当于逆序显示文件内容

        分析此命令的过程:

        几个编辑动作的意思:如果不是第一行,就做G操作,然后做h操作,然后如果不是最后一行,就做d操作

        第1行,因为是第一行,不做G操作,然后做h,将第一行的内容覆盖到保持空间,然后不是第一行,删除模式空间的内容,模式空间没内容

        第2行,因为不是第一行,做G操作,将刚才保持空间中的第一行的信息追加到模式空间,此时模式空间有第2行和第1行,然后做h操作,将模式空间的第2行和第1行覆盖到保持空间,此时保持空间有第2行和第1行,然后做d操作,删除了模式空间的所有内容

        第3行,做G操作,故模式空间有了第3行,第2行和第1行,然后再进行h操作,此时保持空间中的内容有第3行第2行第1行,然后删除模式空间

        ….

        最后一行:做G操作,把保持空间的内容追加到模式空间,然后再做h,把模式空间的内容覆盖到保持空间,然后由于是最后一行,不做d操作,故,此时模式空间的内容是最后一行…第一行 ,逆序排序了

        然后sed的默认动作是把模式空间的内容输出,故显示的结果是将文件逆序排序

        blob.png

      

        

        sed ‘$!d’ FILE  表示显示最后一行

        blob.png

        sed ‘$!N;$!D’ FILE  显示文件的最后两行的内容

        blob.png

        sed ‘/^$/d;G’ FILE  删除原有的所有空白行,然后为每个非空白行后添加一个空白行

        blob.png

        sed ‘n;d’ FILE  显示奇数行

        blob.png

        sed ‘G’ FILE   表示在原有的每行后面都加上一个空白行

        blob.png

    

    

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/32100

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-08-10 10:22
下一篇 2016-08-10 10:22

相关推荐

  • Linux文件系统简介

    文件系统是Linux的十分基础的知识,同时也是学习Linux必不可少的知识。本文将简单的介绍一下Linux的文件系统,主要包括FHS文件层级结构、Linux的文件类型及对应的颜色标识、man帮助手册页以及命令编辑特性的快捷键的介绍。这仅仅是属于自己的一个总结,以后会对深入学习Linux有一定的帮助吧。 如有不对之处还请帮忙指出。 FHS文件层级结构 FHS(…

    Linux干货 2016-10-19
  • Centos启动过程

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。 启动第二步--读取MBR 众所周知,硬盘上第0磁道第一…

    Linux干货 2017-03-30
  • 文本处理工具sed

    处理文本的工具sed     stream EDitor,行编辑器     sed是一种流编辑器,他一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”(pattern space),接着用sed命令处理缓存区中的内容,处理完成后,把缓冲区的内容送往屏幕。…

    Linux干货 2016-08-10
  • 创建私有CA和申请证书流程

    创建私有CA和申请证书流程 由于很多时候做实验需要用到证书,就需要自己搭建一个私有CA来给自己颁发证书。同时通过整理创建CA和申请证书、吊销证书的过程加深自己的理解. PKI:Publilc Key Infrastructure 公钥基础设施:     签证机构:CA     注册机构:RA &nb…

    Linux干货 2016-12-01
  • Linux用户和组管理

      用户和组管理类命令的使用方法 Liunx用户组管理命令: groupadd命令:添加组     命令用法:         groupadd [选项] group_name   &nbs…

    Linux干货 2016-11-25
  • 上海2016全球运维大会 美女辣妹吸引眼球!

    国内第一个运维行业大会 GOPS 2016全球运维大会(上海站)在2016年9月23-24日在上海雅悦新天地大酒店举办,面向IT及传统行业、广大运维技术人员,传播先进技术思想和理念,分享业内最佳实践。 参会两日,虽然大会主角是运维技术交流学习,不过却意料之外的邂逅了另一道靓丽的风景,瞬间燃了… 在会场,站立着一群高挑美女,我的…

    2016-12-05