sed命令详解及实例

    要想灵活的并按照需要处理文本,我们需要充分的学会并掌握三大文本处理工具,grep、sed(数据流编辑器)、awk(报告文本的生成器)

    下面介绍并学习sed命令的基本用法

    sed又名stream editer,是行编辑器(编辑器包括字处理器和文本编辑器),是文本编辑器,是操作纯Ascii码文本的,操作文本是按行进行操作的,逐行处理文本,默认并不直接处理文本本身,操作时是将文本逐行读取到内存中,在内存中处理后并将符合模式匹配到的行显示到屏幕上,内存空间称为sed模式空间。 默认是打印模式空间。   

SYNOPSIS

       sed [OPTION]... {script-only-if-no-other-script} [input-file]...

       sed [OPTION]... 'AddressCommand' file....地址加命令

           $:表示文本中的最后一行

         Option:

            -n:表示静默模式,不显示模式空间中的内容,只与命令相关

            -i:直接修改原文件

            -e script -e script:可以同进执行多个脚本

            -f /path/to/sed_script: 表示读取文件中的脚本对文本进行处理

                sed -f /script file..

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

         Address:

            1、startline,endline,如1,10指从第一行到第10行;

            2、/pattern(regexp正则表达式)/,如/^root/找出以root开头的行

            3、/pattern1/,/pattern2/,表示第一次被模式1匹配到的行和第一次被模式2匹配到的行中间所有的行。

            4、linenumber表示批定的行或特定的行

            5、startline,+N,表示从startline开始后的N行,总共是N+1行;

        Command:

            d:表示删除符合条件的行;

                如:删除/etc/fstab文件中的前四行,如第一行到倒数第二行,则为1,$-1

                [root@station01 ~]# sed "1,4d" /etc/fstab

                如:删除包含sys的行               

                [root@station01 ~]# sed "/sys/d" /etc/fstab

                如:删除第一行开始向后十行的内容               

                [root@station01 ~]# sed "1,+10d" /etc/fstab

                如:只删除第五行则               

                [root@station01 ~]# sed "5d" /etc/fstab

            p:表示显示符合条件的行,默认显示模式空间中的一次和命令匹配到的一次,共二次

                如:显示文件中以/开头的行,并只显示符合条件的行               

                [root@station01 ~]# sed -n "/^\//p" /etc/fstab

            a \sting:在批定或匹配到的行后面新增一行,内容为string

                如:在/开头的行后新增一行,内容为“# It is a blank line.”               

                [root@station01 ~]# sed '/^\//a \# It is a blank line.' /etc/fstab

                 如:在/开头的行后新增两行,内容为“# It is first blank line.”“# It is second  blank line.”

                 [root@station01 ~]# sed '/^\//a \# It is first blank line.\n# It is second  blank line' /etc/fstab

            i \sting:在批定或匹配到的行前面新增一行,内容为string

            r filename:表示在指定的行后将指定的文件内容添加进来,用于合并文件内容

            如:将/etc/issue文件的内容添加到/etc/fstab文件的第二行后               

                [root@station01 ~]# sed '2r /etc/issue' /etc/fstab

            如:将/etc/issue文件的内容添加到/etc/fstab文件的第一行和第二行后               

                [root@station01 ~]# sed '1,2r /etc/issue' /etc/fstab

            w filename:将批定范围内的内容另存至指定的文件中

                如:将包含oot中的文件内容保存到/tmp/oot.tmp文体中,可以使用-n选项

                [root@station01 ~]# sed '/oot/w /tmp/oot.tmp' /etc/fstab

            s/pattern(可以用正则表达式的元字符)/string/修饰符:表示查找匹配到的pattern字符串并替换为string,默认是每一行中第一次被模式匹配到的字符串,如需要替换行中被模式匹配到的所有字符串,则需要加修饰符;其中的/可以换成其它的字符,确保一致即可,并且不需要转义,如###,@@@,%%%等

                    g:全局替换修饰符

                    i:查找时忽略大小写

                如:将/etc/fstab中包含小写oot的字符串替换为大写的OOT               

                   [root@station01 ~]# sed 's/oot/OOT/' /etc/fstab

                如:将/etc/fstab中以/开头的行中的/替换为#               

                   [root@station01 ~]# sed 's/^\//#/' /etc/fstab

                如:将/etc/fstab中的所有/替换为#               

                   [root@station01 ~]# sed 's/\//#/g' /etc/fstab

            后向引用:

                \(\):\1,\2 等

                &:表示模式匹配到的整个串

                如找出以l开头e结尾中间是任意两个字符,替换为在其后加r

                    文件内容如下:

                    [root@station01 ~]# cat sed.txt 
                     he like.
                     her love.

                    #1)执行结果如下:

                    [root@station01 ~]# sed 's%l..e%&r%' sed.txt 
                    he liker.
                    her lover.
                    #2)                    
                    [root@station01 ~]# sed 's%\(l..e\)%\1r%' sed.txt     
                    he liker.
                    her lover.

                若要匹配查找字符串中的一部分时,只能使用后向引用,而不能用&

                    如将l..e,like-->Like,love-->Love时,只能用后向引用  

                    执行结果如下:                  

                    [root@station01 ~]# sed 's%l\(..e\)%L\1%' sed.txt       
                    he Like.
                    her Love.

                如将history命令中的执行结果行首空白删除,并取出行号

                [root@station01 ~]# history | sed -r 's#^[[:space:]]+##g' |cut -d' ' -f1

练习题:

    1、删除/etc/grub.conf文件中行首的空白字符        

        [root@station01 ~]# sed  -r 's#^[[:space:]]+##g' /etc/grub.conf

    2、替换/etc/inittab文件中行中id:3:initdefault:字符串中的3改为6        

        [root@station01 ~]# sed 's#\(id:\)[0-9]\(:initdefault:\)#\16\2#g' /etc/inittab

    3、删除/etc/inittab文件中的空白行

        [root@station01 ~]# sed '/^$/d' /etc/inittab

    4、删除/etc/inittab文件行中开头的#号

        [root@station01 ~]# sed 's/^#//g' /etc/inittab

    5、删除某文件中行首的#及其后面的空白字符

        文件内容如下

        [root@station01 ~]# cat b.txt 
        #    It is a blank.
             #It is second blank.

        执行结果:

        [root@station01 ~]# sed -r 's%^#[[:space:]]+%%g' b.txt 
        It is a blank.
             #It is second blank.

    6、删除某文件中行首的空白字符及其后的#

        文件内容如5中的文件

        [root@station01 ~]# sed -r 's%^[[:space:]]+#%%g' b.txt  
        #    It is a blank.
        It is second blank.

    7、取出某路径的父目录

        [root@station01 ~]# echo "/etc/rc.d/rc4.d/S99local" | sed -r 's@(/.*/)[^/]+/?@\1@g'
/etc/rc.d/rc4.d/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章