天天看点

sed命令简介

<code>文本处理三剑客:</code>

<code>    </code><code>grep:egeep,fgrep:文本过滤器</code>

<code>    </code><code>sed:stream Editor:流编辑器,逐行</code>

<code>    </code><code>awk:文本格式化工具,报告生成器</code>

一、sed简介

    sed一次从文件中读取一行,不会修改原文件的内容

    sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行)

    sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。

    处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。

        放在sed的工作空间:pattern space 处理--&gt;模式匹配--&gt;匹配(则编辑-&gt;根据编辑命令是否输出) //不匹配(stout)

        输出到--&gt;stout

    可以基于正则表达式进行文本过滤

        把文件的

    文件行数据流:---&gt;|pattern space|  //默认显示没有匹配到的行

                            v

                          /      \

                        No        Yes

                        |        /  \

                        |     /    edit

                        |   /        |

                        V/            Hold space 

                        stdout        

        //sed空间:空间可以转换

            pattern space 

            hold space //处理的结果

    sed [option] ... 'script' [input-file]...  //输入文件可以有多个

        script:地址定界+编辑命令

        OPtions:

            -n ,--quiet,--slient不输出模式空间的内容到屏幕

                suppress:压制,不让

            -e script, --expression=script //默认只有一个script,实现多点编辑

            -f script-file //脚本文件,每行一个编辑命令

            -r 支持扩展的正则表达式

            -i 直接编辑原文件

        地址定界:

            1.空地址,表示对全文进行处理

            2.单地址,

                # :指定行

                /pattern/ :被此模式匹配到的每一行

            3.地址范围

                #,# //起始地址

                #,+# //向后几行

                #,/pattern/  //到pattern模式匹配结束

                /pat1/,/pat2/   //斜线是默认的,必须有

            4.步进:~

                1~2 //所有的奇数行

                2~2 //所有的偶数行

        编辑命令:

            d 删除模式空间的内容

                sed '/^UUID/d' /etc/fstab //删除uuid开头的行

                sed '3d' /etc/fstab //删除第3行

                sed '1~2d' /etc/fstab  //显示偶数行,删除奇数行

            p 打印模式空间的内容

                sed '1~2p' /etc/fstab //模式空间显示两遍,

                        //偶数行没有被匹配,因此显示

                        //奇数行被匹配到,默认为显示

                        //edit后的操作是显示

                sed '1~2p' /etc/fstab -n //只显示奇数行,模式空间的内容

            a\test 追加 :在模式匹配到的行,下一行追加文本,支持使用,\n实现多行追加

                后面追加

            i\test:在行前面插入文本,支持使用\n实现多行插入

                sed '3i \new line' fstab.t //不匹配到的行,默认也为输出

                sed '3a \new line\nanother line' fstab.t //插入两行

                sed '/UUID/a \# add new device base on UUID' fstab.t //在每一行的UUID前面都加了信息

            c\text:把匹配到的行替换为此处指定的文本"text";

            主要: "/" 和 "\" 都可以使用

            w /PATH/TO/SOMEWHERE :保存模式空间匹配到的行至指定的文件中

                sed -n '/^[^#]/w /tmp/fsatb.test' fstab //把非#开头的行,保存到文件

            r /PATH/TO/SOMEFILE :读取指定文件的内容到当前文件被模式匹配到的行中

                sed '3r /etc/issue' fstab //在3行,读入issue的内容

                sed '/dev/r /etc/issue' fstab //匹配到的行,都读入issue文件内容

            = 为模式空间匹配到的行,打印行号

                sed '/dev/=' fstab

            ! 条件取反

                sed '/^#/!d' /etc/fstab //模式取反

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

                替换标记:

                    g:全局替换

                    w /PATH/TO/SOMEFILE:保存到指定文件

                    p:显示替换成功的行

二、练习

    1.删除/boot/grub/grub2.cfg文件中所有以空白开头的行的行首的所有空白字符

    2.删除/etc/fstab文件中所有以#开头的行的行首的#号以及#号后面的空白字符

    3.输出一个绝对路径,取出其目录,其行为类似于dirname

        1.sed 's@^[[:space:]]\+@@' /etc/grub2.cfg 

        2.sed 's@^#[[:space:]]*@@' /etc/fstab

            sed 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab

        3.echo "/var/log/messages" | sed 's@[^/]\+$@@'

          echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'  //基本的正则表达式,\?需要转义:可有可无

          echo "/var/log/messages/" | sed -r 's@[^/]+/?$@@'    //扩展的正则表达式

三、高级编辑命令

        h H    Copy/append pattern space to hold space. p-&gt;h

        g G    Copy/append hold space to pattern space. h-&gt;p

            g:get

            大写的为追加,小写的为复制

        x:把两组空间互换,exchange

        n N    Read/append  the  next line of input into the pattern space.

        d 删除模式空间中的行

        D:删除多行模式空间中的行

    示例:

        sed -n 'n;p' /etc/fstab //显示偶数行,n为下一行,分号用于分割命令

        sed ‘1!G' /etc/fstab //除了第一行,都追加一行空白

        sed '1!G;h;$!d' /etc/fstab

                //覆盖模式空间到hold空间,最后一行不删除,其他都删除{删除模式空间的第几行}

                //逆序显示文件内容

        sed '$!d' /etc/fstab  //不是最后一行就删除

        sed '$!N;$!D’ file  //只显示最后两行

            $!N //不是最后一行,追加下一行到模式空间

                倒数第二行,追加最后一行后结束

            $!D //不是最后一行,都删除,

                倒数第二行的时候,追加的是最后一行,所以不删除

        sed '/^$/d;G' /etc/fstab //删除原有的所有空白行,而后为所有的非空白行,后添加一个空白行

        sed 'n;d' file //显示奇数行

        sed 'G' file //在每行后都追加一个空白行

    sed -i '/^UUID/d' fstab //在原有的文件上修改    

注意:任何时候,删除和修改的时候,先备份

本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1950194,如需转载请自行联系原作者