当前位置:首页>Linux>Linux 实战:sed 命令 — 批量改文件不用打开编辑器

Linux 实战:sed 命令 — 批量改文件不用打开编辑器

  • 2026-09-24 13:08:13
Linux 实战:sed 命令 — 批量改文件不用打开编辑器

不用打开文件就能改内容的神器

前两期讲了 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 运维实战技巧
回复「工具」获取运维人必备工具清单

最新文章

随机文章