Linux sed 命令:流式文本编辑实战指南

举报
yd_232564628 发表于 2026/10/10 10:07:48 2026/10/10
【摘要】 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。