sed:Stream EDitor

流编辑器,在编辑文本时是以行为单位进行编辑的,默认不直接编辑原文件,而是将原来的文本数据复制一份到内存中执行编辑操作。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

工作机制

sed默认是将文本的每行读取到pattern space(模式空间)中,进行模式匹配。对能被模式匹配到的行,默认也会输出至标准输出(屏幕),也可以执行编辑操作后再输出至屏幕,但是也有可能不会输出编辑后的文本,例如要删除指定的内容后,就无法输出了;对不能被模式匹配到的行,默认将会输出至屏幕,也可以自定义不输出。

sed的高级功能还包含hold space(保持空间),可以实现在模式空间中的内容进行编辑后再次在保持空间中进行一些更高级的编辑操作,例如将模式空间和保持空间中的内容互换等等。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sed命令用法


sed [OPTION]...  'script'  [input-file] ...


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


[OPTION]常用选项:

    -n:不输出模式空间中的内容至屏幕;

    -e script, --expression=script:支持多点编辑,可以执行多个编辑操作;

    -f  /PATH/TO/SED_SCRIPT_FILE:直接运行sed脚本执行编辑,每行一个编辑命令;

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

    -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件,将编辑后的内容保存在原文件中;


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


'script':地址定界编辑命令


地址定界

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

    (2) 单地址:

            #:指定行;

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

    (3) 地址范围

            #,#:起始行到结束行

            #,+#:起始行至后面跟的多行;例如2,+3表示从第2行到第5行

            #,/pat1/:从指定的行开始,到第一次被模式匹配到的行之间的所有行

           /pat1/,/pat2/:第一次被模式1匹配到的行到第一次被模式2匹配到的行之间的所有行,斜杠/是固定的模式符号

            $:最后一行

    (4) 步进:~

            1~2:所有奇数行

            2~2:所有偶数行


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


编辑命令

    d:删除;

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

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

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

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

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

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

    =:为模式匹配到的行打印行号;每个行号都会显示为一个新行

    !:条件取反;

        地址定界!编辑命令;放到模式后面命令之前

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

        替换标记:

            g:全局替换;

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

            p:显示替换成功的行;


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


例如

1、先查看下/etc/fstab文件中的内容,方便后面对比编辑后的内容

wKiom1Z5V3eTU9kUAABFPWGonK4315.png


2、删除/etc/fstab中第1行到第 5行,注意删除后默认就显示剩下的内容了

wKiom1Z5WECRuP6hAAA4xq8WRFg397.png


3、显示偶数行 (将奇数行删除后就只显示偶数行了)

wKioL1Z5Wo2RsC2_AAAoIa_6mxQ131.png


4、显示奇数行,默认就会显示模式空间中的内容,使用-p选项后会再显示被模式匹配到的行

wKioL1Z5W6PiW-2SAABkOVEZFjc411.png


5、只显示奇数行,只保留编辑后的内容,不显示模式空间中的内容

wKioL1Z6BQbgmAcNAAAlkPA-dpo757.png


6、在第4行前面插入内容为“new line”的新行

wKiom1Z6BQawAJHkAABJN8AuSkI139.png


7、使用-n可以显示只插入的新行

wKioL1Z6BS2Q26SPAAAKFFROgTs683.png


8、在第4行的下方追加内容为“another line”的新行和“the next another line”的新行

wKiom1Z6BSbhcSRDAABNfeoKM4g498.png


9、在所有以UUID开头的行的下方追加内容为“# add new device base on UUID”的新行

wKioL1Z6BWDh0Z_3AABcUh0mGEQ347.png


10、将所有以UUID开头的行的内容替换为“# add new device base on UUID”

wKiom1Z6BWOhqY1cAAA6o3Gfj-U845.png


11、将不是#开头的行的内容保存至/tmp/fstab.1中

wKiom1Z6BXrxIfuNAAAvNbK9QtM975.png


12、在第4行后面读取/etc/issue的内容

wKioL1Z6BaLTb1ojAABW-AYR1Ls670.png


13、显示所有以UUID开头的行的行号

wKioL1Z6BbXjaBgeAABLmuCdzDA289.png


14、使用取反条件显示所有以#号开头的行

wKiom1Z6BbGhH8K3AAAkHlAUHFs476.png


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

wKioL1Z6BdyCHimGAAAhbTqoZF8879.png


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

wKiom1Z6Bd-ipqvxAABE9gw75KE170.png


17、输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname

wKioL1Z6Bf3yfJ6EAAAm2zcMnO4426.png


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


高级编辑命令

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