sed是linux中号称文本处理三剑客的其中之一,是分交互式的文本流编辑器,可以对文本文件和标准输入进行编辑,整个处理过程是sed由标准输入或文本文件读入一行资料并放入pattern space(模式空间)中,sed依照sed script 的编辑指令逐一对pattern space(模式空间)内的资料执行编辑,之後,再由pattern space内的结果送到标准输出,接着再将下一行资料读入.如此重执行上述动作,直至读完所有资料行为止。

    sed是以行对输入进行处理的,处理的是原文件的副本而不是原文件。

    sed命令格式:

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

    常用选项([OPTION]):

           -n, --quiet, --silent: 抑制的自动打印模式空间的内容;不会把读到模式空间的每行内容都输出至屏幕,只输出处理匹配条件后的文本,删除处理时除外;

           -e script, --expression=script:可以加多个编辑命令;

           -f script-file, --file=script-file:可以把sed编辑命令写到文件中然后调用;

           -r, --regexp-extended:支持使用扩展正则表达式;

           -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件,此选项慎用;

    地址定界:

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

            (2)单地址:

                #:指定行;            ;#表示一个阿拉伯数字

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

            (3)地址范围:

                #,#:从指定行到指定行,前边的一定比后边的数字小;

                #,+#:相对与前边指定行后加后边指定行数;

                #,/part1/:从指定数行到第一次匹配到模式的行;

                /part1/,/part2/:从匹配到第一个模式的行,到匹配到第二个模式的行;

                $:最后一行;

            (4)步进:~

                1~2:所有奇数行;

                2~2:所有偶数行;

    编辑命令:

        这里以/etc/fstab复制到/test/fstab下为例,文件内容为:

wKiom1Z-nIbS0SDkAAF_jDt-3ow864.jpg

            d:删除;

                例:删除fstab文件中所有以#开头或者空白的行;

wKiom1Z-nJiB1No-AADrN3TEHig614.jpg

            p:显示模式空间中的内容;

                例:打印出fstab文件中以#开头的所有行;

wKioL1Z-nNPhMOL0AAJEMpfu5Zo861.jpg

                    可以看到所有匹配到的行都打印了两遍,这次我们加上-n选项看效果

wKiom1Z-nP2hfct_AAEKvMNmBn0922.jpg

                    这才是我们想要的效果;

            a \text:在行后面追加文本“text”,支持使用\n实现多行追加;

                例:将cdrom的挂载信息/dev/cdrom /media iso9660 defaults 0 0添加到文件的尾部;

wKiom1Z-nSKAnrdpAAHUdbbLXjk309.jpg                

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

                例:将”it's a test!“这句话添加到/etc/fstab的行前一行;

wKioL1Z-nYaA1zXMAAGiRzjHC-E960.jpg

                注意:这里必须用双引号,不然就会出错;

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

                例:将“who am "I"?”替换/etc/fstab所在行;

wKiom1Z-nUzQ9FI7AAGKpQz-Pzs531.jpg

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

                例:将fstab文件中所有不以#开头的行保存到fstab_test文件中;

wKioL1Z-ndrAzs1IAAIuyGH3Z6g832.jpg

            r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前模式匹配到的行后边,文件合并;

                例:将文件/etc/issue中的内容附加到/test/fstab文件的尾部;

wKioL1Z-nfSjldusAAGpWQeuyrM739.jpg

            =:为匹配到的行打印行号;

                例:为fstab文件的每一行都打印行号;

wKiom1Z-nfLCepaGAAGsve6i-OY916.jpg

                    可以看到为每一行打印的行号都会在该行上一行打印

            !:条件取反;

                    地址定界!编辑命令

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

                    替换标记:

                                g:全局替换;

                        例:将fstab文件中的dev全部替换为大写:

wKioL1Z-niTRXdT5AAFzcL-Ibo0430.jpg

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

wKiom1Z-niCSigqnAAH_HcwEylA089.jpg

                                p:显示替换成功的行;

wKiom1Z-njWhuPJ2AADrxXNxOzw868.jpg

        另外,sed还有一些高级的用法,略显花哨,平常也不会经常用,这里就不多做解释了:

        高级编辑命令:

            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:在原有的每行后方添加一个空白行;