zoukankan      html  css  js  c++  java
  • linux下文本三剑客之sed

    上一篇对正则表达式以及linux三剑客grep的讲解后,这一篇对sed重点介绍。

    一、sed简介

      sed表示流编辑器(Stream Editor)。这是一个简单但功能强大的工具,分析文本,并无缝地转换它。 sed是在1973-1974年由贝尔实验室的李E. McMahon开发。如今,它运行在所有主要的操作系统。

      McMahon编写了一个通用的面向行的编辑器,它最终成为sed。sed借用语法和ed编辑许多有用的功能。自成立开始,就对正则表达式有所支持。sed接受来自文件以及管道的输入。此外,它也可以接受来自标准输入的数据流的输入。

      sed是自由软件由基金会(FSF)维护,它是由GNU/ Linux分发。因此,它通常被称为GNU sed的。对于新手用户,sed语法看起来神秘。但是,一旦熟悉了它的语法,就可以使用sed的几行脚本解决许多复杂的任务。

    二、sed的工作流程

      它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容, 处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间(处理的文件)。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

    下面会有举例对执行流程具体说明
    

    三、sed典型用途

    sed可以有许多不同的方式使用,例如:

    文本替换
    
    选择性打印的文本文件
    
    一个就地文本文件的编辑
    
    文本文件的非交互式的编辑等等。
    

    四、sed工具

    1、功能:

      主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

      参考地址

    2、语法:

    sed[option]... 'script' inputfile...
    

    3、常用选项:

    -n:不输出模式空间内容到屏幕,即不自动打印
    -e: 多点编辑
    -f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本   这里的编辑脚本每行一个不需要带引号
    -r: 支持使用扩展正则表达式   regexp-extended
    -i.bak: 备份文件并原处编辑
    

    4、script(脚本):

    '地址命令'
    

    5、地址定界:

    (1) 不给地址:对全文进行处理
    (2) 单地址:
        #: 指定的行
        /pattern/:被此处模式所能够匹配到的每一行
    (3) 地址范围:
        #,#  从哪行开始到哪行结束
        #,+#
        /pat1/,/pat2/
        #,/pat1/
    (4) ~:步进
        first~step
        first 指起始匹配行, step 指步长
        举例:
            1~2 奇数行
            2~2 偶数行
    

    6、编辑命令:

    d: 删除模式空间匹配的行,并立即启用下一轮循环
    p:打印当前模式空间内容,追加到默认输出之后
    a []text:在指定行后面追加文本
        支持使用
    实现多行追加
    i[]text:在行前面插入文本
    c []text:替换行为单行或多行文本
    w /path/somefile: 保存模式匹配的行至指定文件
    r /path/somefile:读取指定文件的文本至模式空间中
        匹配到的行后:
    =: 为模式空间中的行打印行号
    !:模式空间中匹配行取反处理
    s///:查找替换,支持使用其它分隔符,s@@@,s###
    替换标记:
        g: 行内全局替换
        p: 显示替换成功的行
        w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
    

    五、sed工具使用实例:

    
     ~]#  sed -n '1p' passwd  #只打印第一行
    ~]#  ifconfig eth1 |sed -n 2p  #打印网卡1那一行的ip地址
    ~]#  seq 100 |sed -n '1~2p'  #步进,只显示奇数行
    ~]#  seq 100 |sed -n '2~2p'  #步进,只显示偶数行
    ~]#  sed -i.orig 's/dog/cat/g' pets     #备份后再替换
    ~]#  sed '2adog cat dog cat cat' pets   #在第二行后增加新行
    ~]#  sed '2idog cat dog cat cat' pets   #在第二行前增加新行
    ~]#  sed '2cdog cat dog cat cat' pets   #替换第二行
    ~]#  sed '2w /path/filename' pets   #将第二行保存到指定文件
    ~]#  sed '2r /path/filename' pets   #将指定文件读取并加到第二行后
    ~]#  sed '=' pets   #在显示的结果前显示行号
    

    六、sed的模式空间和保持空间

      sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。

      模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。

      保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。

      正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!

      sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

      一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即可完成主要任务。但是某些时候,通过使用保持空间(hold space),还可以带来意想不到的效果。

    1、高级编辑命令选项:

    P:打印模式空间开端至
    内容,并追加到默认输出之前
    h: 把模式空间中的内容覆盖至保持空间中
    H:把模式空间中的内容追加至保持空间中
    g: 从保持空间取出数据覆盖至模式空间
    G:从保持空间取出内容追加至模式空间
    x: 把模式空间中的内容与保持空间中的内容进行互换
    n: 读取匹配到的行的下一行覆盖至模式空间
    N:读取匹配到的行的下一行追加至模式空间
    d: 删除模式空间中的行
    D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
    

    2、高级编辑举例:

    ~]#  sed -n 'n;p' FILE
    	#显示偶数行
    ~]#  sed '1!G;h;$!d' FILE
    	#逆向显示文件内容
    ~]#  sed 'N;D'  FILE
    	#仅显示最后一行
    ~]#  sed '$!N;$!D' FILE
    	#仅显示文件最后两行
    ~]#  sed '$!d' FILE
    	#仅保留最后一行
    ~]#  sed ‘G’ FILE
    	#每行后加一个空行
    ~]#  sed ‘g’ FILE
    	#将每行内容替换为空行
    ~]#  sed ‘/^$/d;G’ FILE
    	#每行后加一个空行,已有空白行的,仅显示一个空白行
    ~]#  sed 'n;d' FILE 
    	#显示奇数行
    ~]#  sed -n '1!G;h;$p' FILE
    	#逆向显示文件内容
    

    3、对具体实例实现原理图解说明

    ~]#  sed '1!G;h;$!d' FILE.txt
    #逆序显示
    

    注意:sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。

    对各命令先复习一下吧!

    1!:  第一行除外   
    G: 把保持空间的内容读取回来追加至模式空间  
    h: 把模式空间的内容覆盖保存至保持空间
    $!: 最后一行除外
    d: 把空间的内容都删除
    

    对FILE.txt的执行结果进行梳理

    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image)
    image
    image

    通过对三行整个流程的解析可以知道整个显示出来的结果是逆序,非常神奇。
    未来还会有更加好用的工具,用高级编辑命令在生产中不多的。

  • 相关阅读:
    当老板如何带团队?
    创业者第一法宝-了解自己
    交流才能交易,交易才能交心
    集合框架
    MySQL一些命令语法
    JS组成整理
    git中可以pull但是push提示Everything up-to-date的情况
    循环判断以及文件的使用--练习1
    Hello World !
    linux文件权限修改
  • 原文地址:https://www.cnblogs.com/zangfans/p/8413570.html
Copyright © 2011-2022 走看看