sed(Stream Editor)是 Linux 中最强大的文本处理工具之一。它以流式方式逐行处理文本,常用于自动化文本替换、过滤、格式化等场景。与 grep 的查找功能和 awk 的列处理能力互补,sed 在行编辑和替换方面无可替代。
本文将系统介绍 sed 的核心用法,涵盖从基础到进阶的实用技巧。
一、基础语法
sed 的基本调用格式为:
1 2 3
| sed [选项] '命令' 文件名
cat 文件 | sed '命令'
|
最常用的选项:
| 选项 |
作用 |
-n |
关闭默认输出(只打印被 p 命令显式匹配的行) |
-i |
直接修改文件(原地编辑) |
-e |
执行多条命令 |
-r |
启用扩展正则表达式(或 -E) |
| 选项 | 作用 |
-n | 关闭默认输出(只打印被 p 命令显式匹配的行) |
-i | 直接修改文件(原地编辑) |
-e | 执行多条命令 |
-r / -E | 启用扩展正则表达式 |
二、核心命令详解
1. 替换命令 s(最常用)
sed 's/旧内容/新内容/标志'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| echo "hello world hello" | sed 's/hello/hi/'
echo "hello world hello" | sed 's/hello/hi/g'
echo "Hello World" | sed 's/hello/hi/i'
echo "a a a a" | sed 's/a/b/2'
|
2. 打印命令 p
常与 -n 配合使用,只输出匹配的行:
1 2 3 4 5 6 7 8
| sed -n '/error/p' /var/log/syslog
sed -n '5p' /etc/passwd
sed -n '10,20p' file.txt
|
3. 删除命令 d
1 2 3 4 5 6 7 8 9 10 11
| sed '/debug/d' app.log
sed '3,5d' file.txt
sed '/^$/d' file.txt
sed '/^#/d' config.conf
|
4. 插入和追加
1 2 3 4 5 6 7 8
| sed '3i\这是插入的行' file.txt
sed '3a\这是追加的行' file.txt
sed '/pattern/a\第一行\n第二行' file.txt
|
5. 更改命令 c
用新内容替换整行:
1 2 3 4 5
| sed '2c\这是新的第2行' file.txt
sed '/old_config/c\new_config = value' config.ini
|
三、地址范围与模式匹配
行号寻址
1 2 3 4 5 6 7 8
| sed '1s/foo/bar/' file
sed '1,10s/foo/bar/' file
sed '5,$s/foo/bar/' file
|
模式匹配寻址
1 2 3 4 5
| sed '/BEGIN/,/END/s/old/new/' file
sed '/START/,$d' file
|
取反操作 !
1 2 3 4 5
| sed '1!d' file.txt
sed '/protected/!s/foo/bar/' config.txt
|
四、实战案例
案例 1:批量替换 Nginx 配置中的域名
1 2
| sed -i 's/old-domain.com/new-domain.com/g' /etc/nginx/sites-enabled/* echo "所有 Nginx 配置文件中的域名已替换"
|
案例 2:提取配置文件中的有效配置
1 2
| sed '/^#/d; /^$/d' /etc/ssh/sshd_config > sshd_clean.conf
|
案例 3:在 CSV 文件中增加列
1 2 3
| sed -i '1a\new_column' data.csv sed -i '2,$s/$/,default_value/' data.csv
|
案例 4:日志文件时间戳格式化
1 2
| sed -i 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\/\2\/\3/g' app.log
|
案例 5:多文件批量替换
1 2
| find . -name "*.html" -exec sed -i 's|http://old-site.com|https://new-site.com|g' {} \;
|
五、高级技巧
1. 使用分组和反向引用
通过 \(...\) 捕获分组,用 \1、\2 引用:
1 2 3 4 5 6
| echo "lastname,firstname" | sed 's/\(.*\),\(.*\)/\2,\1/'
echo "## Section Title" | sed 's/^\(#*\) \(.*\)/<h\1>\2<\/h\1>/'
|
2. 在替换中使用 shell 变量
1 2 3
| old="foo" new="bar" sed "s/$old/$new/g" file.txt
|
注意:双引号使变量展开,单引号会保持字面值。
3. 多条命令组合
1 2 3 4 5 6 7 8 9 10 11
| sed -e 's/foo/bar/' -e '/^$/d' file.txt
sed 's/foo/bar/; /^$/d' file.txt
sed -f script.sed file.txt
|
4. 原地编辑并备份
1 2 3
| sed -i.bak 's/foo/bar/g' important.conf
|
六、常见陷阱与注意事项
分隔符不限于 /:当路径中含斜杠时,可用 #、|、@ 等作为分隔符
1
| sed 's|/usr/local|/opt|g' paths.txt
|
Mac 的 -i 不同:macOS 上的 sed -i 必须跟备份扩展名,即使不需要也要给空串:
1 2 3 4
| sed -i '' 's/foo/bar/g' file.txt
sed -i 's/foo/bar/g' file.txt
|
大文件处理:sed 流式处理不会将整个文件读入内存,适合处理 GB 级大文件
特殊字符转义:在替换中,& 代表匹配的整段内容,\1~`\9` 代表分组引用
七、小结
sed 是 Linux 文本处理”三剑客”(grep、sed、awk)中的核心成员。掌握 sed 后,你可以:
- 一键完成批量文本替换
- 快速提取和过滤日志信息
- 编写自动化配置修改脚本
- 处理 GB 级大文件而不消耗大量内存
从简单的替换到复杂的多行编辑,sed 都能胜任。建议读者在日常工作中多使用 sed 完成文本处理任务,逐步积累经验,你会发现它比手动编辑文件高效得多。
本文由AI辅助生成,内容仅供参考