Linux sed 命令:流式文本编辑实战指南
【摘要】 sed (Stream Editor) 是 Linux 三剑客(grep、sed、awk)之一,诞生于 1974 年。与 grep 的"筛选行"、awk 的"按列处理"不同,sed 的核心定位是按行编辑——它逐行读取文本到模式空间(Pattern Space),执行指定的编辑命令后输出结果,默认不修改原文件。这使得 sed 在批量替换、配置文件修改、文本格式化等场景中无可替代。 最基础的用法...
sed (Stream Editor) 是 Linux 三剑客(grep、sed、awk)之一,诞生于 1974 年。与 grep 的"筛选行"、awk 的"按列处理"不同,sed 的核心定位是按行编辑——它逐行读取文本到模式空间(Pattern Space),执行指定的编辑命令后输出结果,默认不修改原文件。这使得 sed 在批量替换、配置文件修改、文本格式化等场景中无可替代。
最基础的用法
sed 's/old/new/' file.txt
s是 substitute(替换)命令,格式为s/原内容/新内容/。- 默认只替换每行第一个匹配项,加
g(global) 标记可替换所有匹配:sed 's/old/new/g' file.txt - 不加
-i时只输出到终端,原文件不变。确认无误后再加-i原地修改。
实际使用中,高频场景与命令组合
1. 原地修改与备份
# 直接修改原文件(危险!)
sed -i 's/old/new/g' file.txt
# 修改前自动备份为 .bak(推荐)
sed -i.bak 's/old/new/g' file.txt
-i (in-place) 直接修改原文件,建议始终带上备份后缀,防止误操作。
macOS 注意:macOS 的 sed 基于 BSD,
-i必须带备份后缀,如sed -i '' 's/old/new/g' file.txt。
2. 按行号操作
# 删除第 5 行
sed '5d' file.txt
# 删除第 3~7 行
sed '3,7d' file.txt
# 删除最后一行
sed '$d' file.txt
# 只打印第 10~20 行(类似 head/tail 组合)
sed -n '10,20p' file.txt
# 打印第 5 行
sed -n '5p' file.txt
-n 取消默认输出,只有显式 p 的行才会打印。
3. 按正则匹配操作
# 删除所有空行
sed '/^$/d' file.txt
# 删除所有注释行(以 # 开头)
sed '/^#/d' file.txt
# 删除包含 "debug" 的行
sed '/debug/d' file.txt
# 只打印包含 "error" 的行(类似 grep)
sed -n '/error/p' file.txt
# 在包含 "server" 的行后面追加一行
sed '/server/a\ listen 80;' nginx.conf
4. 条件替换(只在特定行替换)
# 只在包含 "ERROR" 的行中替换 "warning" 为 "critical"
sed '/ERROR/ s/warning/critical/g' log.txt
# 在第 5~10 行范围内替换
sed '5,10s/old/new/g' file.txt
# 从包含 "start" 的行到包含 "end" 的行之间替换
sed '/start/,/end/s/foo/bar/g' file.txt
地址(行号或正则)写在命令前面,限定操作范围。
5. 插入与追加
# 在第 3 行前插入
sed '3i\这是插入的行' file.txt
# 在第 3 行后追加
sed '3a\这是追加的行' file.txt
# 在文件开头插入
sed '1i\# 配置文件头部' file.txt
# 在文件末尾追加
sed '$a\# 配置文件尾部' file.txt
# 在匹配行后追加
sed '/server_name/a\ root /var/www/html;' nginx.conf
i (insert) 在行前插入,a (append) 在行后追加,c (change) 替换整行。
6. 替换中的特殊符号
# & 引用匹配的原文本
sed 's/[0-9]\+/[&]/g' file.txt # 将数字用方括号包裹
# \1 \2 引用分组
sed 's/$[0-9]\{4\}$-$[0-9]\{2\}$-$[0-9]\{2\}$/\3\/\2\/\1/' file.txt
# 将 2026-10-10 转换为 10/10/2026
# 使用其他分隔符避免转义
sed 's|/usr/local/bin|/opt/bin|g' file.txt # 用 | 替代 /
sed 's#http://#https://#g' file.txt # 用 # 替代 /
当替换内容中包含 / 时,换用 |、# 等作为分隔符可以大幅减少转义。
7. 删除行尾/行首空白
# 删除行尾空白
sed 's/[[:space:]]*$//' file.txt
# 删除行首空白
sed 's/^[[:space:]]*//' file.txt
# 同时删除行首和行尾空白
sed 's/^[[:space:]]*//; s/[[:space:]]*$//' file.txt
; 分隔多条命令,依次执行。
8. 多命令组合
# 多个 -e 参数
sed -e 's/foo/bar/g' -e '/^$/d' file.txt
# 用分号分隔
sed 's/foo/bar/g; /^$/d' file.txt
# 从脚本文件读取命令
sed -f script.sed file.txt
9. 配合管道使用
# 修改命令输出后传递给下一个命令
ps aux | sed -n '/nginx/p' | awk '{print $2}'
# 批量修改多个文件
find ./conf -name "*.conf" -exec sed -i.bak 's/8080/80/g' {} \;
# 快速查看配置文件的有效内容(去注释、去空行)
sed '/^#/d; /^$/d' /etc/nginx/nginx.conf
10. 扩展正则表达式
# 使用 -E 启用扩展正则(无需转义括号、加号等)
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' file.txt
# 匹配多个模式之一
sed -n -E '/error|warning|critical/p' log.txt
-E (或 -r) 启用扩展正则表达式,语法更简洁。
如果不知道如何下手,可以先尝试
sed 's/old/new/g' file.txt
先不加 -i 跑一遍,确认替换结果符合预期。确认无误后,再加 -i.bak 原地修改并保留备份:
sed -i.bak 's/old/new/g' file.txt
或者,当你想快速清理一个配置文件中的注释和空行时:
sed '/^#/d; /^$/d' /etc/nginx/nginx.conf
sed 与相关工具对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
grep |
按行匹配筛选 | 过滤包含某关键词的行 |
sed |
按行编辑替换 | 批量替换、删除行、插入行 |
awk |
按列处理计算 | 提取列、统计、格式化输出 |
三者常配合使用:grep 过滤行 → sed 替换内容 → awk 提取列。
安全注意事项
- 先预览再修改:始终先不加
-i确认输出,再加-i.bak原地修改。 - 备份后缀不可省:
-i.bak比裸用-i安全得多,出错时mv file.bak file即可恢复。 - 特殊字符要转义:
/、&、\等在替换内容中需要正确处理。 - macOS 兼容性:BSD sed 的
-i语法与 GNU sed 不同,跨平台脚本需注意。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)