1. 简介
sed是一种在线编辑器、行编辑器,一次处理一行内容,在处理时,把当前的行存储到临时缓冲区中,该缓冲区称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完毕后,把缓冲区的内容送到标准输出;然后紧接着去处理下一行,重复完成相同的操作,直至文件末尾;sed处理的整个过程中,对象文件中的内容并没有改变,除非使用重定向来存储处理后的结果。sed主要用来自动编辑一个或多个文件,简化文件的反复操作过程。
流程如下图:
sed命令详解_第1张图片
2. sed命令功能
sed [OPTION]... {script-only-if-no-other-script} [input-file]...

  • 常用选项:
    -n:表示不输出模式空间中内容至屏幕
      -e script1 -e script2 -e script3:多点编辑
      -f /path/to/script_file:从指定的文件中读取脚本并运行
      -i:直接修改源文件
      -r:支持扩展正则表达式
  • script:地址定界 编辑命令
    1.地址定界
    (1)空地址:对全文进行处理
    (2)单地址:
    #:指定行
    /pattern/:指此模式所匹配到每一行
    (3)地址范围:
    #,#:表示数字,指定行
    $:最后一行
    #,/regexp/:从#开始,到第一次被/regrexp/所匹配到的行结束,中间的所有行
    /regexp1/,/regexp2/:从第一次被/regexp1/所匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间所有的行
    (4)步进:
    1~2:所有奇数行
    2~2:所有偶数行
    2.编辑命令:
    d:删除模式空间的行
    p:显示模式空间的内容
    a\text:在行后面追加文本,支持使用\n实现多行追加
    i \text:在行前面插入文本,支持使用\n实现多行插入
    c\text:用text替换匹配到的行
    w /path/to/somefile:把指定内容另存至/path/to/somefile路径所指定的文件中
    r /path/tp/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并br/>s/regexp/replacement/:替换由regexp所匹配到内容为replacement
    (支持使用其他分隔符如s@@@,s###;条件是该分隔符在后面的模式中
    没有出现过),对于替换还有2个后选项g和i,分别表示如下:
    g:全局替换
    i:不区分大小写
    3.常用命令功能演示:
    (1)显示/etc/fstab第3行内容:
           ` sed -n '3p' /etc/fstab`
        (2)显示/etc/fstab第3至6行内容:
             ` sed -n '3,6p' /etc/fstab`
        (3)显示/etc/fstab奇数行内容:
             `sed -n '1~2p' /etc/fstab`
        (4)显示/etc/fstab的最后一行
           ` sed  -n '$p' /etc/fstab`
        (5)删除/boot/grub2/grub.cfg文件中所有行的行首的空白字符
          ` sed 's/^[[:space:]]\+//g'  /boot/grub2/grub.cfg`
         (6)删除/boot/grub2/grub.cfg文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符:
        ` sed 's/^#[[:space:]]\+//g' /boot/grub2/grub.cfg`
        (7)把/tmp/grub.cfg的文件的奇数行另存为/tmp/grub.cfg3
        ` sed '1~2w /tmp/grub.cfg3' /tmp/grub.cfg` 
         (8)echo一个文件路径取出其基名,进一步取出其路径名
            如:取出路径名:`echo "/etc/sysconfig/network-scripts/" | sed  -r  's@[^/]+/?$@@'`
                     取出基名:`echo "/etc/sysconfig/network-scripts/" | sed   's@^.*/\([^/]\+\)/\?$@\1@'`

    4.sed的高级用法
    sed除了模式空间(pattern space)还有一个"hold space"的内存空间,称之为保持空间
    高级编辑命令:
    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':在文件中的每行都加空白行