sed(Stream Editor)是 Linux/Unix 下的流式文本编辑器,主要用于对文本进行查找、替换、删除、插入等操作,支持正则表达式,适合处理大文件或自动化脚本。
1. sed 基本语法
sed [选项] '命令' 文件名
常用选项:
-n:只输出处理后的行(默认会输出所有行)-i:直接修改文件(不加-i则只输出到屏幕,不修改原文件)-e:执行多个命令(如sed -e 's/a/A/' -e 's/b/B/' file)-r:使用扩展正则表达式(支持+,?,|等)
2. sed 常用命令
| 命令 | 说明 | 示例 |
|---|---|---|
s | 替换(substitute) | sed 's/old/new/' file |
d | 删除(delete) | sed '/pattern/d' file |
p | 打印(print) | sed -n '/pattern/p' file |
a | 追加(append) | sed '3a newline' file |
i | 插入(insert) | sed '3i newline' file |
c | 替换整行(change) | sed '/pattern/c newline' file |
3. sed 常见用法示例
(1)替换文本
# 替换每行第一个匹配的 "foo" 为 "bar"
sed 's/foo/bar/' file.txt
# 替换所有匹配的 "foo"(加 g 表示全局替换)
sed 's/foo/bar/g' file.txt
# 只替换第 2 行的 "foo"
sed '2s/foo/bar/' file.txt
# 替换第 2-5 行的 "foo"
sed '2,5s/foo/bar/' file.txt
# 替换包含 "pattern" 的行中的 "foo"
sed '/pattern/s/foo/bar/' file.txt
(2)删除行
# 删除第 3 行
sed '3d' file.txt
# 删除第 2-5 行
sed '2,5d' file.txt
# 删除包含 "pattern" 的行
sed '/pattern/d' file.txt
# 删除空行
sed '/^$/d' file.txt
(3)打印特定行
# 打印第 5 行
sed -n '5p' file.txt
# 打印第 2-5 行
sed -n '2,5p' file.txt
# 打印包含 "pattern" 的行
sed -n '/pattern/p' file.txt
# 打印匹配 "start" 到 "end" 之间的行
sed -n '/start/,/end/p' file.txt
(4)插入/追加行
# 在第 3 行后追加 "new line"
sed '3a new line' file.txt
# 在第 3 行前插入 "new line"
sed '3i new line' file.txt
# 在匹配 "pattern" 的行后追加 "new line"
sed '/pattern/a new line' file.txt
(5)替换整行
# 替换第 3 行为 "new line"
sed '3c new line' file.txt
# 替换包含 "pattern" 的整行
sed '/pattern/c new line' file.txt
(6)直接修改文件(-i 选项)
# 替换并直接修改文件(危险!建议先不加 -i 测试)
sed -i 's/foo/bar/g' file.txt
# 备份原文件并修改(加 .bak 备份)
sed -i.bak 's/foo/bar/g' file.txt
4. 高级用法
(1)使用正则表达式
# 替换所有数字为 "X"
sed 's/[0-9]/X/g' file.txt
# 替换所有以 "a" 开头的单词为 "A"
sed 's/\ba\w*/A/g' file.txt
# 删除所有 HTML 标签
sed 's/<[^>]*>//g' file.html
(2)多命令组合
# 替换 "foo" 为 "bar",并删除空行
sed -e 's/foo/bar/g' -e '/^$/d' file.txt
# 使用分号分隔多个命令
sed 's/foo/bar/; s/hello/world/' file.txt
(3)引用匹配内容(& 和 \1, \2, ...)
# 给所有数字加括号
sed 's/[0-9]/(&)/g' file.txt
# 交换第 1 列和第 2 列(假设用空格分隔)
sed 's/\(.*\) \(.*\)/\2 \1/' file.txt
5. 经典应用场景
(1)批量替换文件内容
# 替换所有 .txt 文件中的 "old" 为 "new"
sed -i 's/old/new/g' *.txt
(2)提取特定行
# 提取日志文件中的错误行
sed -n '/ERROR/p' app.log
(3)删除注释行
# 删除所有以 # 开头的行
sed '/^#/d' config.conf
(4)格式化文本
# 在每行行首添加行号
sed = file.txt | sed 'N;s/\n/ /'
6. 总结
sed主要用于流式文本处理,适合查找、替换、删除、插入等操作。- 常用命令:
s:替换d:删除p:打印a/i/c:追加/插入/替换整行
- 使用
-i直接修改文件,但需谨慎(建议先测试)。 - 支持正则表达式,可结合
grep、awk进行复杂文本处理。
掌握 sed 可以极大提高 Linux 下的文本处理效率! 🚀