不用打开文件就能改内容的神器
前两期讲了 grep(找)和 awk(拆、算),今天讲三剑客的最后一个——sed。
sed 的本事是"改"。不用打开 Vim,不用手动编辑,一行命令就能批量替换、删除、插入内容。
说白了:grep 找得到,awk 拆得开,sed 改得了。
1. 替换文本:s/old/new/
echo "hello world" | sed 's/world/Linux/'
# 输出: hello Linux
s = substitute(替换),默认只替换每行第一个匹配。想全部替换,加 g:
echo "foo bar foo baz foo" | sed 's/foo/FOO/g'
# 输出: FOO bar FOO baz FOO
2. 直接修改文件:-i
sed 最强大的地方在于它能直接改文件,不用打开编辑器:
# 直接修改文件(⚠️ 不可逆!)
sed -i 's/old/new/g' config.txt
# 先备份再修改(推荐)
sed -i.bak 's/old/new/g' config.txt
# 原文件改为 config.txt.bak,修改后的内容写入 config.txt
-i = in-place,原地修改。加 .bak 会自动备份原文件。生产环境一定要加备份,改错了还能恢复。
3. 删除行:d
# 删除第 2 行
echo -e "line1\nline2\nline3" | sed '2d'
# 删除空行
sed -i '/^$/d' config.txt
# 删除包含 "debug" 的行
sed -i '/debug/d' app.log
地址 + d = 删除。地址可以是行号、正则、或者范围。
4. 插入和追加:i 和 a
# 在第 2 行前面插入
echo -e "line1\nline3" | sed '2i\line2'
# 在第 2 行后面追加
echo -e "line1\nline3" | sed '2a\line2.5'
i = insert(前面插入),a = append(后面追加)。
5. 只打印指定行:-n + p
# 只打印第 2-4 行
echo -e "a\nb\nc\nd\ne" | sed -n '2,4p'
# 输出:
# b
# c
# d
-n = 静默模式(不自动打印),p = print。配合使用就像 grep 的行号版。
6. 地址范围:指定操作哪些行
# 只替换第 3-5 行的内容
sed '3,5s/old/new/g' file.txt
# 只处理包含 "error" 的行
sed '/error/s/DEBUG/INFO/g' app.log
# 从第 10 行到文件末尾
sed '10,$s/old/new/g' file.txt
地址格式:行号、起始,结束、/正则/、$ 表示最后一行。
7. 多个操作:-e 和分号
# 用 -e 连接多个操作
echo "foo bar baz" | sed -e 's/foo/FOO/' -e 's/bar/BAR/'
# 用分号连接(一行搞定)
echo "foo bar baz" | sed 's/foo/FOO/; s/bar/BAR/'
8. 实用技巧:配置文件批量修改
# 注释掉 sshd_config 里的某行
sed -i 's/^PermitRootLogin yes/# PermitRootLogin yes/' /etc/ssh/sshd_config
# 取消注释
sed -i 's/^# PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
# 删除配置文件里的空行和注释行
sed -e '/^$/d' -e '/^#/d' config.txt
# 在某行后面追加配置
sed -i '/\[mysqld\]/a\max_connections=200' /etc/mysql/my.cnf
9. 分组捕获:\1 \2
# 交换两个字段
echo "hello:world" | sed 's/\(.*\):\(.*\)/\2:\1/'
# 输出: world:hello
# 给 IP 加方括号
echo "192.168.1.1" | sed 's/\([0-9.]*\)/[\1]/'
# 输出: [192.168.1.1]
\(\) 捕获分组,\1 \2 引用捕获组。这在处理日志格式转换时特别好用。
速查表
| 场景 |
命令 |
| 替换(每行第一个) |
sed 's/old/new/' file |
| 替换(全部) |
sed 's/old/new/g' file |
| 直接修改文件 |
sed -i 's/old/new/g' file |
| 备份再修改 |
sed -i.bak 's/old/new/g' file |
| 删除第 N 行 |
sed 'Nd' file |
| 删除空行 |
sed '/^$/d' file |
| 删除匹配行 |
sed '/pattern/d' file |
| 在第 N 行后插入 |
sed 'Ni\新行内容' file |
| 只打印第 N-M 行 |
sed -n 'N,Mp' file |
| 注释掉某行 |
sed -i 's/^/# /' file |
一句话总结
grep 找得到,awk 拆得开,sed 改得了。三剑客配合起来,Linux 文本处理基本无敌。
关注我,每周分享 Linux 运维实战技巧

—— 三页札记 ——
下期预告:awk — 日志分析神器
👆 觉得有用?长按识别二维码关注,每周分享 Linux 运维实战技巧
回复「工具」获取运维人必备工具清单