16365

82 分钟

#Bash 的 sed 命令

sed [OPTION]... SCRIPT [FILE]...

功能

用于过滤和转换文本的流式编辑器。

类型

可执行文件(/usr/bin/sed)。

参数

  • OPTION 选项:
    • -n, --quiet, --silent - 不自动输出;默认打印所有行,开启此选项则只打印 p 命令匹配的行
    • --debug - 打印执行过程
    • -e script, --expression=script - 指定处理脚本;可多次使用此选项传递多个处理脚本
    • -f script-file, --file=script-file - 从 script-file 中读取处理脚本
    • --follow-symlinks - 修改文件时跟踪符号链接
    • -i[SUFFIX], --in-place[=SUFFIX] - 修改原文件;如果指定了 SUFFIX,则写入添加了后缀 SUFFIX 的文件
    • -l N, --line-length=N - 为 l 命令指定所需的换行长度
    • --posix - 禁用 GNU 扩展
    • -E, -r, --regexp-extended - 处理脚本中使用扩展正则表达式
    • -s, --separate - 将文件视为独立的,而非单一连续的长流
    • --sandbox - 以沙盒模式运行(禁用 e r w 模式)
    • -u, --unbuffered - 从输入文件中加载最少量的数据,并更频繁的更新输出
    • -z, --null-data - 以空字符(\0)作为行的结尾,而不是换行符(\n
    • --help - 显示帮助
    • --version - 显示版本
  • SCRIPT - 处理脚本
  • FILE - 输入文件,省略此参数或将此参数设为 - 则读取标准输入

#脚本命令

命令含义
s替换
d删除
p打印
a追加
i插入
c替换整行
y字符转换
r读取文件
w写入文件

详见 示例

#正则表达式

sed 主要支持两种风格的正则:基本正则 (BRE - Basic Regular Expression)扩展正则 (ERE - Extended Regular Expression)

核心差异对比

特性基本正则 (BRE)扩展正则 (ERE)
选项无 (默认)-E
次数匹配 {n,m}\{n,m\}{n,m}
分组 ()\(\)()
或运算 |\||
1次或多次 +\++
0次或1次 ?\??
预定义类 (如 \d)不支持不支持
非贪婪匹配不支持不支持

#基本正则表达式

这是 grep 默认使用的模式。它的原则是“尽量把字符当成普通文本”,因此很多特殊元字符需要通过反斜杠 \ 转义后才具有特殊含义。

  • ?, +, {, |, (, ) 这些符号在 BRE 中被视为普通字符。
  • 如果要使用它们的正则功能,必须转义:\?, \+, \{, \|, \(

#扩展正则表达式

ERE 简化了语法,去掉了大部分反斜杠。它认为这些特殊符号“天生”就应该是功能符号。

  • 使用 -E 选项开启
  • ?, +, {, |, (, ) 直接作为正则的元字符使用,无需转义。
  • 如果要将它们当作普通字符,必须转义:\?, \+, \{, \|, \(

#示例

打印(p)

$ sed -n '1,3p' file.txt                # 打印 1 至 3行
$ sed -n '/error/p' file.txt            # 打印包含 error 的行
  • -n 选项表示只打印 p 匹配的行

替换(s)

$ sed 's/http/https/' file.txt          # 将每行第一个 http 替换为 https
$ sed 's/http/https/g' file.txt         # 将所有 http 替换为 https
$ sed '3s/http/https/' file.txt         # 将第 3 行第一个 http 替换为 https
$ sed '3s/http/https/g' file.txt        # 将第 3 行所有 http 替换为 https
  • 上述命令将修改后的内容打印到标准输出,而不修改源文件
  • 添加 -i 选项则会修改源文件
  • 末尾的 g 表示全局模式

整行替换(c)

$ sed '2c \xplanc.org' file.txt         # 将第二行替换为 xplanc.org
$ sed '2,4c \xplanc.org' file.txt       # 将 2 至 4 行合并为一行并替换为 xplanc.org
$ sed '/TODO/2c \xplanc.org' file.txt   # 将 TODO 匹配的行整行替换为 xplanc.org
  • 上述命令将修改后的内容打印到标准输出,而不修改源文件
  • 添加 -i 选项则会修改源文件

转换(y)

$ sed 'y/123/abc/' file.txt             # 将所有的 1 替换为 a,2 替换为  b,3 替换为 c
  • 上述命令将修改后的内容打印到标准输出,而不修改源文件
  • 添加 -i 选项则会修改源文件

删除(d)

$ sed '2d' file.txt                     # 删除第 2 行
$ sed '2,4d' file.txt                   # 删除 2 到 4 行
$ sed '$d' file.txt                     # 删除最后一行
$ sed '7,$d' file.txt                   # 删除 7 到最后一行
  • 上述命令将修改后的内容打印到标准输出,而不修改源文件
  • 添加 -i 选项则会修改源文件

追加(a)

$ sed '2a \Hello' file.txt              # 在第 2 行后追加   
$ sed '$a \Hello' file.txt              # 在最后一行后追加   
$ sed '/Linux/a \Hello' file.txt        # 在 Linux 匹配的行之后追加 
  • 上述命令将修改后的内容打印到标准输出,而不修改源文件
  • 添加 -i 选项则会修改源文件

行号定位

$ sed -n '5p' file.txt                 # 第 5 行
$ sed -n '1,3p' file.txt               # 第 1 到 3 行
$ sed -n '5,$p' file.txt               # 第 5 行到最后
$ sed -n '1~2p' file.txt               # 奇数行(从第 1 行开始每隔 2 行)
$ sed -n '2~3p' file.txt               # 从第 2 行开始每隔 3 行
  • -n 选项表示只打印 p 匹配的行

正则定位

$ sed -n '/^root/p' file.txt           # 以 root 开头的行
$ sed -n '/bash$/p' file.txt           # 以 bash 结尾的行
$ sed -n '/error/!p' file.txt          # 不包含 error 的行
$ sed -n '/start/,/end/p' file.txt     # 从包含 start 的行到包含 end 的行
  • -n 选项表示只打印 p 匹配的行

混合定位

$ sed -n '1,/error/' file.txt          # 从第 1 行到包含 error 的行
$ sed -n '/error/,20' file.txt         # 从包含 error 的行到第 20 行
$ sed -n '/start/,/end/p' file.txt     # 从包含 start 的行到包含 end 的行
  • -n 选项表示只打印 p 匹配的行

混合命令

$ sed -n 's/http/https/gp' file.txt    # 将所有 http 替换为 https,并且只打印匹配的行
  • s 表示替换、g 表示全局模式、p 表示打印
  • -n 选项表示只打印 p 匹配的行

#推荐阅读

#手册

更新: 2026/2/6

作者: PlanC

创建: 2026/2/6