Linux sed命令详解
Linux sed 命令详解 🧰🐧
学习目标
- 理解
sed是什么及其在文本流处理中的核心作用 - 掌握基本的文本替换、删除、插入等操作
- 能够使用正则表达式进行高级文本编辑
- 熟悉如何在 Shell 脚本中结合
sed实现自动化任务 - 了解
sed在不同发行版(Ubuntu、CentOS、EulerOS)中的行为差异与兼容性问题
核心重点 ✅
| 功能 | 描述 |
|---|---|
| 流编辑器 | 对输入文本(文件或管道)进行逐行处理 |
| 支持正则表达式 | 可使用 BRE(基本正则表达式)进行匹配和替换 |
| 替换文本 | 支持全局替换、按行替换等多种方式 |
| 删除/插入/追加内容 | 可以删除某一行,也可以插入或追加新内容 |
| 多命令支持 | 使用 -e 或脚本文件执行多个操作 |
| 文件就地修改 | 使用 -i 参数可直接修改原文件(慎用!) |
详细讲解
1. sed 是什么?
sed 全称 stream editor,是一个强大的文本流编辑器。它不是用于交互式编辑,而是用于非交互式地对文本进行转换和处理。
示例一:基本输出
echo "Hello, World!" | sed 's/World/Linux/'
输出:
Hello, Linux!
🔍
s表示 substitute(替换),是sed中最常用的命令之一。
2. 常用语法与参数说明 🛠️
| 选项 | 含义 | 示例 |
|---|---|---|
s/pattern/replacement/flags |
替换模式 | sed 's/apple/orange/' file.txt |
d |
删除匹配行 | sed '/error/d' log.txt |
p |
打印匹配行(需配合 -n) |
sed -n '/success/p' log.txt |
i\ |
在匹配前插入文本 | sed '/start/i\New line before' file.txt |
a\ |
在匹配后追加文本 | sed '/end/a\Append after end' file.txt |
c\ |
替换整行内容 | sed '/old/c\new content' file.txt |
-n |
禁止默认输出 | sed -n '3p' file.txt |
-e |
多条命令 | sed -e 's/a/b/' -e '/b/d' file.txt |
-f script.sed |
从脚本文件执行命令 | sed -f commands.sed input.txt |
-i |
就地修改文件(慎用!) | sed -i 's/old/new/g' file.txt |
3. 实战应用场景分析 🎯
场景一:替换文件中的特定字符串(全局替换)
sed 's/ubuntu/debian/g' config.txt
这个命令会将 config.txt 中所有的 ubuntu 替换为 debian,但不会修改原文件,仅输出到终端。
✅ 如果你想保存修改,请使用
-i参数:
sed -i 's/ubuntu/debian/g' config.txt
场景二:删除包含关键字的行
sed '/error/d' /var/log/syslog
该命令会删除所有包含 error 的行,并输出结果。
⚠️ 注意:如果使用
-i,会永久删除这些行!
场景三:只显示匹配行(配合 -n 和 p)
sed -n '/warning/p' /var/log/syslog
这只会打印出包含 warning 的日志行,非常适用于日志过滤。
场景四:在指定位置插入或追加内容
sed '3i\This is a new line' file.txt
该命令会在第 3 行前插入一行文字。
sed '5a\This is appended line' file.txt
该命令会在第 5 行后添加一行。
场景五:替换整行内容
sed '/^root/c\root:x:0:0:Admin:/root:/bin/bash' /etc/passwd
这个命令会将 /etc/passwd 中以 root 开头的行替换成新的内容。
场景六:批量修改多个文件(结合 find + xargs)
find . -name "*.txt" | xargs sed -i 's/hello/world/g'
这个命令会递归查找当前目录下所有 .txt 文件,并将其中的 hello 替换为 world。
4. 不同发行版下的差异 ⚖️
| 发行版 | 默认行为 | 特性支持 |
|---|---|---|
| Ubuntu (Debian) | GNU sed,默认完整支持各种参数 | 包括 -i, -r, -E |
| CentOS 7+ | 默认安装 GNU sed | 支持标准功能,部分系统可能版本较旧 |
| EulerOS | 类似于 CentOS | 适合企业级部署,稳定性高 |
| macOS(BSD) | BSD sed,部分参数不一致 | 如 -i 必须带备份后缀,如 '' |
📝 macOS 差异示例:
# macOS 上必须这样写:
sed -i '' 's/old/new/g' file.txt
# 若想保留备份:
sed -i '.bak' 's/old/new/g' file.txt
5. 注意事项 ⚠️
- ✅ 使用
-i参数时一定要谨慎,建议先测试命令再执行,或者备份原文件。 - ✅ 正则表达式中特殊字符如
/、.、*需要转义(\)。 - ✅
sed是按行处理的,不适合处理二进制文件。 - ✅ 可以使用
-r或-E启用扩展正则表达式,简化书写(如不用写\()。 - ✅ 在脚本中使用
sed时建议加上错误判断,例如:
sed 's/old/new/g' file.txt > temp.txt && mv temp.txt file.txt || echo "Error occurred"
6. 综合练习题 🧩
✅ 练习 1:将 data.txt 中所有 apple 替换为 orange,并输出结果
sed 's/apple/orange/g' data.txt
✅ 练习 2:删除所有空行并输出结果
sed '/^$/d' data.txt
✅ 练习 3:在每行前面添加 “Line: ”
sed 's/^/Line: /' data.txt
✅ 练习 4:只显示第 5 到第 10 行的内容
sed -n '5,10p' data.txt
✅ 练习 5:在 /etc/hosts 中添加一行 127.0.0.1 localhost
sed -i '$a\127.0.0.1\tlocalhost' /etc/hosts
🎉 总结
sed 是 Linux 下最强大、最灵活的文本处理工具之一,尤其适合用于自动化脚本、日志清洗、配置文件修改等场景。掌握其基本语法、正则表达式、多命令组合和就地修改技巧,将极大提升你在 Linux 系统上的文本处理效率。
对于你当前的学习环境(Windows 连接阿里云 ECS Ubuntu),建议你在实际环境中多动手实践上述命令,结合 cat、grep、xargs、find、awk、vim 等命令组合使用,你会发现它的真正威力!💪🐧
如果你还想深入了解 awk、Shell 脚本自动化、日志分析实战等内容,欢迎随时继续提问 👇
替换含有特殊字符的字符串:关键技巧
在使用 sed 命令进行替换时,如果要替换的字符串中包含特殊字符(如 /, @, &, *, . 等),这些字符通常具有正则表达式中的特殊含义。如果不进行转义处理,会导致命令出错或匹配不符合预期。
✅ 替换含有特殊字符的字符串:关键技巧
1. 使用反斜杠 \ 转义特殊字符
这是最标准的做法,适用于所有发行版和 sed 版本。
示例:替换 /usr/local/bin 为 /opt/myapp/bin
echo "/usr/local/bin" | sed 's/\/usr\/local\/bin/\/opt\/myapp\/bin/'
输出:
/opt/myapp/bin
虽然写法繁琐,但兼容性最好。
2. 使用其他分隔符代替 /
sed 的替换命令默认使用 / 作为分隔符,但我们也可以使用其他字符,比如 #, |, : 等,这样可以避免频繁转义 /。
示例:用 # 替代 / 分隔符替换路径
echo "/usr/local/bin" | sed 's#/usr/local/bin#/opt/myapp/bin#'
输出:
/opt/myapp/bin
✅ 这种方式更清晰、易读,推荐在替换路径等含 / 的内容时使用。
3. 替换包含 & 的内容
& 在 sed 中表示“匹配到的内容”,如果你想把它当作普通字符替换,也需要转义。
示例:将 hello&world 替换为 hi&there
echo "hello&world" | sed 's/hello&world/hi&there/'
⚠️ 会报错!因为 & 是保留字符。
✅ 正确做法是使用单引号包裹整个表达式,并对 & 转义:
echo "hello&world" | sed 's/hello&world/hi\&there/'
4. 替换包含 @ 的内容(如邮箱)
@ 并不是 sed 的特殊字符,但在某些正则表达式中可能有特殊用途(例如 Perl 兼容正则中),为了保险起见,建议在复杂表达式中也进行转义。
示例:替换 user@example.com 为 admin@example.com
echo "user@example.com" | sed 's/user@example.com/admin@example.com/'
✅ 可以正常运行。
但如果是在变量中动态替换,建议统一使用转义:
sed 's/user@example\.com/admin@example\.com/'
5. 批量替换多个特殊字符(结合正则表达式)
如果你需要替换的字符串中含有多个特殊字符,可以使用正则表达式来匹配。
示例:替换包含任意特殊字符的字符串
echo "This is a test.string with/special@chars" | \
sed 's/test\.string\ with\/special@chars/replaced_text/'
⚠️ 注意:
.、/、@都需要转义!
🛠️ 实战练习题
✅ 练习 1:替换文件中所有的 /etc/passwd 为 /etc/shadow
sed 's#/etc/passwd#/etc/shadow#' file.txt
✅ 练习 2:替换 http://example.com 为 https://example.com
sed 's#http://example.com#https://example.com#' file.txt
✅ 练习 3:替换字符串 user@domain.com 为 support@company.org
sed 's/user@domain.com/support@company.org/' file.txt
✅ 练习 4:替换路径 /home/user/data 为 /mnt/storage/data(使用 | 分隔符)
sed 's|/home/user/data|/mnt/storage/data|' file.txt
📌 总结
| 特殊字符 | 是否需转义 | 处理方式 |
|---|---|---|
/ |
是 | 使用 \ 或换用 #、` |
\ |
是 | 使用 \\ 转义 |
& |
是 | 使用 \& 表示原义字符 |
.、*、?、[、] |
是 | 在正则中代表通配符,需转义 |
@、-、_、: |
否(一般) | 可不转义,但复杂表达式中建议统一处理 |
📌 最佳实践建议:
- 尽量使用非
/字符作为分隔符(如#或|),提升可读性; - 对所有特殊字符进行转义,避免歧义;
- 替换前先用
echo测试命令是否正确; - 修改系统文件时使用
-i.bak备份原文件。
如果你还想了解如何在 Shell 脚本中安全使用 sed 替换变量内容,请继续提问👇****

浙公网安备 33010602011771号