sed命令

一、sed的工作原理

     sed是一个行编辑器,只能一行一行的处理文本信息,每次取出一行信息先放到模式空间中,然后根据给出的模式进行匹配。要是被模式匹配不到就默认输出至屏幕,模式空间中有内容还会再输出一次;要是能够被模式匹配到,默认会被输出至屏幕,但是,还有一种情况就是需要被编辑之后再做相应的操作,比如删除,替换等等。


二、命令的格式
    sed [OPTION]...  'script'  [input-file] ...
       (一) script:
            1.格式

              地址定界编辑命令

              注意:地址定界符和编辑命令之间必须没有空格    


   
            2.常用选项
               -n:不输出模式空间中的内容至屏幕;
               -e script, --expression=script:多点编辑;
               -f  /PATH/TO/SED_SCRIPT_FILE
                   每行一个编辑命令;
                -r, --regexp-extended:支持使用扩展正则表达式;
                -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;


     
            3.地址定界
                (1) 空地址:对全文进行处理;
                (2) 单地址:
                    #:指定行;
                    /pattern/:被此模式所匹配到的每一行;
                (3) 地址范围,#代表任意数字数字
                    #,#:从起始行到结束行
                    #1,+#2:相对地址表示法,从#1开始向后#2,包含#1.。例如:3,+8:从第三行开始向后8行,包含第三行,总共就是9行。
                    #,/pat1/:从指定的行开始到第一个被模式匹配到的行中间的所有行
                    /pat1/,/pat2/:从第一个被模式匹配到的行开始到第二个被模式匹配到的行中间的所有行                       $:最后一行;


                (4) 步进:~
                     1~2:所有奇数行,从1开始每次步进2
                     2~2:所有偶数行,从2开始每次步进2       



            4. 编辑命令:
                 d:删除;
                 p:显示模式空间中的内容;
                 a  \text:在行后面追加文本“text”,支持使用\n实现多行追加;
                 i  \text:在行前面插入文本“text”,支持使用\n实现多行插入;
                 c  \text:把匹配到的行替换为此处指定的文本“text”;
                 w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
                 r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
                 =:为模式匹配到的行打印行号;
                 !:条件取反;
                    地址定界!编辑命令;
                 s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;


           5.替换标记:
                 g:全局替换;
                 w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
                 p:显示替换成功的行;


      (二) 示例:    

            1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
                    # sed  's@^[[:space:]]\+@@' /etc/grub2.cfg
            2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
                    # sed  's@^#[[:space:]]*@@'  /etc/fstab
            3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
                   # echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'       


       

三、高级编辑命令

   (一)选项:

        h:把模式空间中的内容覆盖至保持空间中;
        H:把模式空间中的内容追加至保持空间中;
        g:把保持空间中的内容覆盖至模式空间中;
        G:把保持空间中的内容追加至模式空间中;
        x:把模式空间中的内容与保持空间中的内容互换;
        n:覆盖读取匹配到的行的下一行至模式空间中;
        N:追加读取匹配到的行的下一行至模式空间中;
        d:删除模式空间中的行;
        D:删除多行模式空间中的所有行;


   (二)示例:
        sed  -n  'n;p'  FILE:显示偶数行;
        sed  '1!G;h;$!d'  FILE:逆序显示文件的内容;
        sed  ’$!d'  FILE:取出最后一行;
        sed  '$!N;$!D' FILE:取出文件后两行;
        sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
        sed  'n;d'  FILE:显示奇数行;
        sed 'G' FILE:在原有的每行后方添加一个空白行;