文本处理三剑客之剑二 -----------sed流编辑器

    grep、sed和awk在Linux/Unix系统中并称为文本处理三剑客(结合正则表达式使用);正则表达式


1、什么是sed?    shell

        sed是非交互式文本编辑器,它能够对文本文件和标准输入进行编辑,标准输入能够是来自键盘输入、文件重定向、字符串、变量,甚至来自管道的文本。它是流式编辑器。vim


2、sed的工做过程:app

        sed从文本的一个文本行或标准输入中读取数据,将其复制到缓冲区,而后读取命令行或脚本的第一个命令,对此命令要求的行号进行编辑,重复此过程,直到命令行或脚本中的全部命令执行完毕。
编辑器


3、特色:ide

        相对于其余的文本编辑sed具有如下让人难以拒绝的特色;函数

        一、 非交互式,基于模式匹配的过滤及修改文本。spa

        二、逐行处理,因此对温馨的交互式编辑而言太大的文件使用sed会显得 十分高效
命令行

,为用户节省了大量的时间。orm

        三、可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各类编辑操做。

        四、脚本化,在shell脚本编辑中vim须要通知处理文件的哪几行才会去处理,而sed默认会处理文件的全部行。

        五、sed只对缓冲区(模式空间)中原始文件的副本进行编辑,不编辑原文件。若是要把编辑后的内容保存,能够将输出重定向输出到另外一个文件。


4、sed适用于如下三种场合

        一、编辑相对交互式文件编辑器而言太大的文件

        二、编辑命令太复杂,在交互式文本编辑器中难以输入的状况

        三、对文件扫描一遍,可是须要执行多个编辑函数的状况


5、sed 相关使用详解:

  一、语法格式:sed [OPTION]... {script-only-if-no-other-script} [input-file]...

        OPTION----选项

        script-----地址定界编辑命令

        input-file----输入文件

  二、选项[OPTION]


                (1)、经常使用选项:

                            -n:不输出(模式空间)中的内容到标准输出(显示屏);

                                        sed  -n '1p' input 

                            -e:多点编辑(-e script),表示将下一个字符串解析为sed编辑命令。若是只传送一个命令给sed时,-e 能够省略;

                                        sed  -e '1p/p'  -e  '1p/=’input 

                            -f:表示正在调用sed脚本文件(-f  /PATH/TO/SED_SCRIPT_FILE),每行一个编辑命令。

                                        例如:脚本append.sed脚本演示sed追加文本方法

                                                   #!/bin/sed -f

                                                    /file:/a\                  a\表示此处换行添加文本 

                            -r:从文本中读取文本,支持扩展正则表达式;

                                        echo “aa bb” | sed -r 's/(.)/a/'            若是不加-r时,后面的()符号要转义

                            -i:在定位行号以前直接编辑原文件。

                                        sed  -i 's/inn/out/g' test.txt             


                 (2)、地址定界:

                            sed命令一般由定位文本行和sed编辑命令两部分组成;

                                    使用行号,指定一行,或指定行号范围

                                    使用正则表达式

                            1)、空地址:对全文进行处理

                            2)、单地址:

                                   x:表明指定行号;

                                    /pattern/:查看包含模式的行,或此模式匹配到的行

                            3)、地址范围:

                                    x,y:指定x到y的行号范围内

                                    x,+y:指定x,到后面y行范围

                                    x,/pattern/:从x号行到与/pattern/的匹配行之间的行

                                    /patter/pattern/:查询包含两个模式的行

                                    $:最后一行

                            4)、步进:~

                                    1~2:匹配全部奇数行

                                    2~2:匹配全部的偶数行


                 (3)、地址定界:

                            d:删除,删除所匹配到的行(后面通常不接什么)

                            p:列印,显示模式空间中的内容(一般与sed -n 一块儿出现)

                            a\text:新增,text为字串,这些字串会在新增到下一行出现

                            i\text :插入,text为字串,这些字串会在新增到上一行出现

                            c\text:替换 ,text为字串 ,这些字串能够取代n1,n2之间的行

                            s///:查找替换,能够直接进行替换,一般结合正则表达式 法,

                                                        其分隔符可自行指定,经常使用的有s@@@, s###等

                                                       g:全局替换;

                                                       w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;     

                                                       p:显示替换成功的行;


6、sed 实例:

            举例:(假设咱们有一文件名为ab)

                 删除某行
                         [root@localhost gayj# sed '1d' ab              #删除第一行 
                         [root@localhost gayj] # sed '$d' ab              #删除最后一行
                         [root@localhost gayj] # sed '1,2d' ab           #删除第一行到第二行
                         [root@localhost gayj] # sed '2,$d' ab           #删除第二行到最后一行

              显示某行
                         [root@localhost gayj# sed -n '1p' ab           #显示第一行 
                         [root@localhost gayj] # sed -n '$p' ab           #显示最后一行
                         [root@localhost gayj] # sed -n '1,2p' ab        #显示第一行到第二行
                         [root@localhost gayj] # sed -n '2,$p' ab        #显示第二行到最后一行

              使用模式进行查询
                         [root@localhost gayj] # sed -n '/gayj/p' ab    #查询包括关键字gayj所在全部行
                         [root@localhost gayj] # sed -n '/\$/p' ab        #查询包括关键字$所在全部行,使用反斜线\屏蔽特殊含义

              增长一行或多行字符串
                         [root@localhost gayj]# cat ab
                         Hello!
                         gayj is me,welcome to my blog.
                         end
                         [root@localhost gayj] # sed '1a drink tea' ab  #第一行后增长字符串"drink tea"
                             Hello!
                             drink tea
                             gayj is me,welcome to my blog. 
                             end
                             [root@localhost gayj] # sed '1,3a drink tea' ab #第一行到第三行后增长字符串"drink tea"
                                 Hello!
                                 drink tea
                                 gayj is me,welcome to my blog.
                                 drink tea
                                 end
                                 drink tea
                             [root@localhost gayj] # sed '1a drink tea\nor coffee' ab   #第一行后增长多行,使用换行符\n
                                 Hello!
                                 drink tea
                                 or coffee
                                 gayj is me,welcome to my blog.
                                 end

              代替一行或多行
                             [root@localhost gayj] # sed '1c Hi' ab                #第一行代替为Hi
                                 Hi
                                 gayj is me,welcome to my blog.
                                 end
                             [root@localhost gayj] # sed '1,2c Hi' ab             #第一行到第二行代替为Hi
                                 Hi
                                 end

              替换一行中的某部分
                         格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串能够用正则表达式)
                             [root@localhost gayj] # sed -n '/gayj/p' ab | sed 's/gayj/bird/g'    #替换gayj为bird
                           [root@localhost gayj] # sed -n '/gayj/p' ab | sed 's/gayj//g'        #删除gayj

                 插入
                             [root@localhost gayj] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
                             [root@localhost gayj]# cat ab
                                 Hello!
                                 gayj is me,welcome to my blog.
                                 end
                                 bye

                 删除匹配行

                              sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则须要“”,而不是‘’。记得好像是)

                  替换匹配行中的某个字符串

                          sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

相关文章
相关标签/搜索