sed使用与实战

sed使用与实战

Sed使用与实战

sed是一款常用的流式编辑器,按行处理

1. 工作流程

sed每次只从文本中读入一行 ,然后对改行进行指定的编辑操作,并将处理的结果输出到标准输出(默认行为),然后继续下一行操作。sed有两个缓冲区 : 模式空间(编辑被匹配的数据使用),保持空间(用于后续存放数据使用),其工作流程大致如下:

工作流程

模式空间

2. 常用选项

  • 命令格式 sed [option] ... '地址定界编辑命令' [input-file]...
  • -n : 不输出模式空间的内容到屏幕
  • -e :script, 多点编辑,如 sed -e 'script1' -e 'script2' ....
  • -f /path/file:从文本中读取编辑命令,一行一个
  • -r : 扩展正则表达式
  • -i: 直接编辑原文件

3. 地址定界

  • 空地址 : 对全文进行处理
  • 单地址:
    • #:指定的行
    • /pattern/:被此模式匹配的所有行
  • 地址范围:
    • #,#
    • #,+#
    • #,/pat1/
    • /pat1/,/pat2/
    • $ 最后一行
  • 步进 : #(开始行)~#(步长)
    • 1~2: 所有的奇数行
    • 2~2:所有的偶数行

4. 编辑命令

  • d: 删除

  • p: 显示模式空间的内容

  • a \text ,在行后追加text,支持使用\n实现多行追加

  • i \text , 在行前追加text,支持使用\n实现多行追加

  • c \text , 匹配到的行,替换成text内容

  • w /path/file 保存模式空间匹配到的行到指定的文件中

  • r /path/file 读取指定文件的内容到当前模式匹配到的行的后面

  • = : 为模式匹配到的行,打印行号,在匹配到行的下方

  • !: 条件取反 地址定界!编辑命令

  • s/// :查找替换,其分隔符可以自行制定,如s@@@,s###等,支持替换标记如下

    • g: 全局替换
    • w /path/file 将替换成功的结果保存到指定的文件中
    • p 显示替换成功的行
  • 示例

    #练习1:删除/boot/grub2/grub.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
    [root@localhost ~]# sed 's/^[[:space:]]\+//g' /boot/grub2/grub.cfg				
    #练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
    [root@localhost ~]# sed "s@^#[[:space:]]*@@g" /etc/fstab 
    #练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
    echo "/var/log/messages" | sed 's@[^/]\+/\?$@@'
    

5. 高级编辑命令

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