sed 命令的基本使用方法
2025/12/21大约 3 分钟
sed 命令的基本使用方法
面试口述要点(约 1 分钟)
sed(Stream Editor)是流式文本编辑器,用于非交互式文本处理,核心特性是逐行读取、按模式匹配、执行编辑操作、输出结果:
基础语法:sed [选项] '命令' 文件
- 常用选项:
-n静默模式(不自动打印)、-i原地编辑文件、-e多条命令、-r/-E扩展正则
核心命令:
s/pattern/replacement/flags:替换,flags 包括g全局、p打印、数字指定第几次、i忽略大小写p:打印匹配行(需-n配合)d:删除匹配行a\text:在匹配行后追加、i\text:在匹配行前插入c\text:替换整行w file:写入文件!:取反操作
地址范围:指定操作范围
3d:删除第 3 行/pattern/d:删除匹配行2,5d:删除 2-5 行/start/,/end/d:删除从 start 到 end 的区间1~2d:删除奇数行(步长)
典型场景:
# 替换(不修改文件)
sed 's/old/new/g' file.txt
# 原地修改文件
sed -i 's/old/new/g' file.txt
# macOS 需要 sed -i '' 's/old/new/g' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除注释行
sed '/^#/d' file.txt
# 打印第 10-20 行
sed -n '10,20p' file.txt
# 在匹配行后插入
sed '/pattern/a\new line' file.txt
# 多条命令
sed -e 's/foo/bar/' -e 's/old/new/' file.txt
# 或用分号
sed 's/foo/bar/; s/old/new/' file.txt相关高频面试题与简答
Q1: sed 替换时如何处理特殊字符(如 / 或 &)?
# 方法 1:更换分隔符(推荐)
sed 's|/path/to/file|/new/path|g' file.txt
sed 's#old#new#g' file.txt
# 方法 2:转义
sed 's/\/path\/to\/file/\/new\/path/g' file.txt
# & 代表匹配到的整体
sed 's/error/[&]/g' file.txt # error -> [error]Q2: sed 如何只替换每行第 N 次匹配?
# 替换每行第 2 次出现
sed 's/foo/bar/2' file.txt
# 替换每行第 2 次及之后所有
sed 's/foo/bar/2g' file.txt
# 只替换第 3 行的第 1 次
sed '3s/foo/bar/' file.txtQ3: 如何用 sed 实现配置文件参数修改?
# 修改 key=value 格式
sed -i 's/^server_port=.*/server_port=8080/' config.ini
# 修改 YAML/TOML 中的缩进值
sed -i 's/^ workers:.*/ workers: 4/' config.yaml
# 仅修改已存在的配置(避免误加)
sed -i '/^#.*server_port/! s/server_port=.*/server_port=8080/' config.iniQ4: sed 如何删除文件中的某些行?
# 删除空行
sed '/^$/d' file.txt
# 删除注释与空行
sed '/^#/d; /^$/d' file.txt
# 删除第 5-10 行
sed '5,10d' file.txt
# 删除包含 "error" 的行
sed '/error/d' file.txt
# 删除不包含 "keep" 的行(只保留匹配行)
sed '/keep/!d' file.txt
# 等价于 sed -n '/keep/p'Q5: sed 与 awk 如何选择?
- sed:面向行的简单文本替换、删除、插入,模式匹配+单一操作。
- awk:面向列(字段)的复杂文本处理、统计、格式化输出,支持变量、函数、条件。
- 典型分工:sed 改配置文件/日志过滤,awk 提取特定列/计算/报表。
Q6: macOS 的 sed 与 Linux sed 有什么区别?
# macOS(BSD sed)必须提供备份扩展名
sed -i.bak 's/old/new/g' file.txt # 生成 file.txt.bak
sed -i '' 's/old/new/g' file.txt # 不备份需空字符串
# Linux(GNU sed)
sed -i 's/old/new/g' file.txt # 直接修改
# 扩展正则
# macOS: -E
# Linux: -r 或 -E(新版)
# 解决跨平台:安装 GNU sed
# macOS: brew install gnu-sed,使用 gsed实用技巧与注意事项
技巧:
- 先测试不加
-i,确认输出正确后再原地修改 - 用
-i.bak保留备份防止误操作 - 复杂替换可用变量分组
\1 \2:sed 's/\(old\) \(text\)/\2 \1/' - 多文件批量处理:
find . -name "*.conf" -exec sed -i 's/old/new/g' {} \;
常见坑:
- 忘记
-n导致重复输出(p命令需配合-n) - macOS
-i后缺少备份扩展名或空字符串 - 正则未转义导致字面匹配失败(
.*[]等) - 分隔符冲突(路径中有
/,应改用|或#)
速查命令清单
| 操作 | 命令示例 |
|---|---|
| 全局替换 | sed 's/old/new/g' file |
| 原地修改 | sed -i 's/old/new/g' file |
| 删除空行 | sed '/^$/d' file |
| 删除注释 | sed '/^#/d' file |
| 打印匹配行 | sed -n '/pattern/p' file |
| 打印指定行 | sed -n '10,20p' file |
| 行后插入 | sed '/pattern/a\text' file |
| 行前插入 | sed '/pattern/i\text' file |
| 替换整行 | sed '/pattern/c\text' file |
| 多命令执行 | sed -e 'cmd1' -e 'cmd2' file |
| 区间操作 | sed '/start/,/end/d' file |
| 取反删除 | sed '/keep/!d' file |