linux命令-sed

sed流编辑器(stream editor) sed手册

处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

1
2
3
4
sed 选项 '子命令' 文件名
sed 选项 -e '子命令1' -e '子命令2' 文件名
sed -f 脚本文件 文件名
sed -f 脚本1 -f 脚本2 文件名
  • 可以指定多个 -e-f
  • sed 中变量使用单引号包含双引号方式: '"$var"'

选项

  • -e--expression=命令 指定用以处理文件的脚本内容
  • -f--file=脚本文件 指定用以处理文件的脚本文件
  • -i--in-place[=SUFFIX] 编辑文件内容并取代原文件
  • -n--quiet--silent 安静模式 仅显示处理后的结果
  • -l--line-length=N 指定换行期望长度
  • -r-regexp-extended 启用扩展的正则表达式
  • -u–unbuffered 从输入文件中加载最少的数据,并更频繁的刷出到输出缓冲区
  • -z–null-data 使用NULL字符分割行(默认每一行使用换行符分割)

子命令

多个子命令间使用;分隔。

行定位

在行定位命令后紧邻写上各种操作命令

单行

  • 数字n:第n行
  • $:最后一行
  • 正则/pattern/: 匹配该正则的那行

多行

  • 数字m,n: 第m到n行

  • 数字和正则混合/pattern/,nn,/pattern/

  • 两个正则之间的行:/pattern1/,/pattern2/

  • n! 取反:除了第n行 m,n!

  • n~x:从第n行开始处理,下一次处理当前行后面的x行

    例如1~2表示从第1行开始处理,下一次处理当前行后面的第2行,也就是依次处理1,3,5,7……行

打印 p

将模式空间写到标准输出。注意:使用sed 'p' filename会将文件内容每行打印两次,配合-n(或--quiet--silent) 则可只打印一次(仅显示处理后的结果)。

1
2
sed  --quiet '2,10p' file  #打印第2到10行
sed --quiet ''

替换 s

命令格式: s/原内容/新内容/

  • g全局替换:s/原内容/新内容/g
1
ip addr | grep -o -E '1[^2][0-9?](\.[0-9]{1,3}){3}\/' -o | sed 's/\///'  #本机ip

行编辑

  • 新增行
    • a 在匹配项的下一行新增内容
    • i 在匹配项的上一行新增内容
  • 替换行 c
  • 删除行 d
  • 多行
    • N 将数据流中的下一行加进来创建一个多行组来处理
    • D 删除多行组中的一行
    • P 打印多行组中的一行
1
2
sed  -i -e '1a hello' -e '2i world' filename
sed -i -e '1d' -e '2c new-world' filename

模式空间

把当前处理的行存储在临时缓冲区中——模式空间。

  • N 将下一行内容纳入当前缓冲区
  • h 将模式空间复制到保持空间
  • H 将模式空间附加到保持空间
  • g 将保持空间复制到模式空间
  • G 将保持空间附加到模式空间
  • x 交换模式空间和保持空间的内容