sed------流编译器
1、sed 是什么?
sed(Stream Editor,流编辑器)是 Linux 系统中处理文本的核心工具之一。它以 "逐行处理" 为核心逻辑,读取文本流(文件 / 管道输入)、在内存中编辑(模式空间)、输出处理结果,全程不默认修改原文件,是批量文本替换、删除、插入的高效利器。
基本语法:
bash
sed [选项] '命令' 文件
sed [选项] -e '命令1' -e '命令2' 文件
sed [选项] -f 脚本文件 文件
2、sed 核心工作原理
sed 处理文本的过程可总结为 "三步循环":
(1)读取:从输入源读取一行内容,存入 "模式空间"(临时内存区域);
(2)执行:对模式空间中的内容执行指定的 sed 命令;
(3)输出:将模式空间的内容打印到标准输出,清空模式空间,重复上述步骤直到文本处理完毕。
3、sed 高频用法
测试文件内容:

3.1 文本替换(最核心:s 命令)
替换是 sed 最常用的场景,基础格式:
bash
sed 's/匹配内容/替换内容/选项' 文件名
常见用法:
# 1.1 基础替换:每行仅替换第一个匹配项
sed 's/old/new/' test.txt
# 1.2 全局替换:每行所有匹配项都替换(g 选项)
sed 's/old/new/g' test.txt
# 1.3 忽略大小写替换(i 选项)
sed 's/old/new/gi' test.txt
# 1.4 特殊分隔符:替换路径/含斜杠内容时,用 | 替代 / 避免转义
sed 's|/bin/bash|/bin/sh|g' /etc/passwd
# 1.5 直接修改原文件(-i 选项,谨慎使用!)
sed -i 's/old/new/g' test.txt
部分结果展示:
(1)基础替换(每行仅替换第一个 "pattern" 为 "target")

(2) 全局忽略大小写替换(所有 "pattern/Pattern" 替换为 "target")

3.2 文本删除(d 命令)
常见用法:
# 2.1 删除指定行:删除第 5 行
sed '5d' test.txt
# 2.2 删除行范围:删除 3-8 行
sed '3,8d' test.txt
# 2.3 删除匹配行:删除包含 "error" 的行
sed '/error/d' test.txt
# 2.4 删除空行(^$ 匹配空行)
sed '/^$/d' test.txt
部分结果展示:
(1)删除包含数字的行

(2)删除空行

3.3 文本插入 / 追加 / 替换(i/a/c 命令)
常见用法:
# 3.1 行前插入(i):在第 2 行前插入内容
sed '2i\===== 插入的内容 =====' test.txt
# 3.2 行后追加(a):在匹配 "target" 的行后追加内容
sed '/target/a\===== 追加的内容 =====' test.txt
# 3.3 覆盖替换行(c):将第 3 行内容替换为指定文本
sed '3c\===== 替换后的内容 =====' test.txt
部分结果展示:
(1)行前插入(i):在第 2 行前插入内容

(2)覆盖替换,将第 3 行内容替换为指定文本

3.4 精准打印(p 命令 + -n 选项)
-n 用于关闭 sed 自动打印,仅输出匹配内容,避免重复输出:
# 4.1 打印第 10 行
sed -n '10p' test.txt
# 4.2 打印匹配行:打印包含数字的行
sed -n '/[0-9]/p' test.txt
结果展示:
(1)打印第10行
(2)打印包含数字的行

4、sed 进阶:地址范围控制
sed 可通过 "行号 / 模式" 限定命令生效范围,精准处理文本:
# 1. 行号范围:仅处理 5 到最后一行($ 表示最后一行)
sed '5,$s/old/new/g' test.txt
# 2. 模式范围:仅处理从 "start" 匹配行到 "end" 匹配行之间的内容
sed '/start/,/end/s/old/new/g' test.txt
结果展示:
处理从 "Empty" 匹配行到 "only" 匹配行之间的内容,替换 "a" 为 "A"

5、sed 实用场景举例
# 1. 清理 HTML 标签:删除所有 <xxx> 格式的标签
sed 's/<[^>]*>//g' index.html
# 2. 合并多行到一行:将换行符替换为空格
sed ':a;N;$!ba;s/\n/ /g' test.txt
# 3. 配置文件注释:给以 "app.debug=" 开头的行加注释
sed 's/^\(app\.debug=\)/#\1/' config.ini
# 4. 取消注释:移除包含 "app.maintenance" 行的开头 #
sed 's/^#\+\(.*app\.maintenance.*\)/\1/' config.ini
结果展示:
(1)配置文件注释:给以 "Empty" 开头的行加注释

(2)取消注释:移除以 "#" 开头且包含 "Empty" 行的注释(添加注释基础之上)

6、总结
sed 以 "流处理" 为核心,无需加载整个文件到内存,适合处理大文本;
核心优势是批量编辑、无交互修改、正则支持 。掌握 s/d/a/i/p 核心命令 + 地址范围控制,就能解决 90% 的文本编辑场景。
