Skip to content

sed 命令详解:流式批量编辑文本 ​

本文是 Linux 命令速查 中 sed 的从 0 到 1 详解。 目标:把 sed --help 里的选项和 s///、p、d、地址定址、分组讲清楚,多看几遍后,你在服务器上敲 sed --help 就知道该用哪个。 环境依据:GNU sed 4.8(Ubuntu 22.04 自带;RHEL/Rocky 自带版本用法一致)。

一、命令是干什么的 ​

sed 是 stream editor(流式编辑器):它一行行读输入,按你给的"脚本"对每行做处理(替换、删除、打印),再输出。最常见的用途是批量替换文件里的字符串,不用打开编辑器手动改。

  • 替换:sed 's/旧词/新词/g';
  • 删行:sed '/某词/d';
  • 打印指定行:sed -n '10,20p';
  • 加 -i 直接改原文件。

类比:sed 就像一个"自动批改机",把文件每一行递进去,它按规则改完再吐出来。你不用打开 vim 一行行找替换,一条命令把几百个文件里的 old.com 全改成 new.com。它是文本三剑客之一。

它属 sed 包。

二、命令语法 ​

bash
sed [选项] '脚本命令' [文件]...
  • [选项]:如 -n(静默)、-i(原地改)、-E(扩展正则)、-e(指定脚本);
  • '脚本命令':sed 的核心,形如 地址+s/旧/新/;
  • [文件]:要处理谁;不写就从标准输入读。

sed 默认把每行都输出,加 -n 后只有主动 p 的行才输出。

三、选项全表(对照 sed --help) ​

1. 命令行选项 ​

选项中文含义什么场景用
-n,--quiet,--silent静默:不自动打印每行,只打印脚本里 p 的行只想看指定行时(常用)
-e 脚本,--expression=脚本指定一段脚本(可多次用,串多个动作)一条命令里做好几件事
-f 脚本文件从文件读脚本脚本很长时
-i[后缀],--in-place[=后缀]直接改原文件;给后缀则生成备份(如 -i.bak)批量改文件(高危)
-E,-r用扩展正则(支持 +、()、|)写分组捕获时(推荐)
-z按 NUL 而不是换行分隔处理特殊文件名
--posix关掉 GNU 扩展追求可移植时

2. sed 脚本里的常用命令(核心) ​

命令作用示例
s/旧/新/替换每行第一个匹配s/foo/bar/
s/旧/新/g替换全行所有匹配s/a/X/g
p打印当前行配合 -n 选行
d删除当前行d
地址只对匹配的行生效10,20(第10-20行)、/关键词/
&代表"整个匹配到的串"s/[0-9]*/[&]/ 给数字加括号
\1 \2分组捕获的第 1、2 段配合 -E 的 ()

地址定址是 sed 的精髓:可以给行号(5、1,10、$ 最后一行),也可以给正则(/error/),写在命令前面就表示"只对这些行动手"。

四、由浅入深的典型示例 ​

演示在 /tmp/sre_shard_txt 下。

示例 1:基本替换 ​

bash
echo "hello world 123" | sed 's/world/SED/'
text
hello SED 123

s/旧/新/ 把第一个 world 换成 SED。

示例 2:全局替换(加 g) ​

bash
echo "a b a c a" | sed 's/a/X/g'
text
X b X c X

不加 g 只换第一个;加 g(global)一行里所有 a 都换掉。

示例 3:不加 g 只换第一个 ​

bash
echo "a b a c a" | sed 's/a/X/'
text
X b a c a

只有开头第一个 a 被换,后面的不动。

示例 4:静默模式打印指定行(-n + p) ​

bash
sed -n '2,4p' demo.txt
text
banana
apple
cherry

-n 关掉默认全打印,2,4p 只打印第 2 到 4 行。这等于 head/tail 的灵活版,能取任意行段。

示例 5:只打印含某词的行 ​

bash
sed -n '/apple/p' demo.txt
text
apple
apple
apple

地址 /apple/ 表示"只对含 apple 的行",再 p 打印——效果类似 grep apple。

示例 6:删除含某词的行(d) ​

bash
sed '/apple/d' demo.txt
text
banana
cherry
banana
date

/apple/d:含 apple 的行直接删掉,剩下的照常输出。

示例 7:按行号删除 ​

bash
sed '3d' demo.txt
text
apple
banana
cherry
banana
apple
date

删掉第 3 行(原来是 apple)。也可以 sed '3,5d' 删一段。

示例 8:用 & 引用整个匹配 ​

bash
echo "version 123" | sed 's/[0-9][0-9]*/[&]/'
text
version [123]

& 代表"正则匹配到的那一段",这里把数字 123 包进方括号。

示例 9:分组捕获(-E + \1\2) ​

bash
echo "phone 13812345678" | sed -E 's/([0-9]{3})([0-9]{4})([0-9]{4})/\1-\2-\3/'
text
phone 138-1234-5678

-E 开启扩展正则,() 分三组,\1 \2 \3 分别引用,于是手机号被切成 138-1234-5678。

示例 10:原地改文件并备份(-i) ​

bash
cp demo.txt demo.bak.txt
sed -i.bak 's/apple/APPLE/g' demo.bak.txt
cat demo.bak.txt
text
APPLE
banana
APPLE
cherry
banana
APPLE
date

-i.bak 直接改 demo.bak.txt,同时把原文件备份成 demo.bak.txt.bak。生产批量改前一定先不加 -i 跑一遍看效果,确认无误再加。

示例 11:多个动作串起来(-e) ​

bash
echo "Hello World" | sed -e 's/Hello/Hi/' -e 's/World/There/'
text
Hi There

两个 -e 依次执行:先把 Hello 换成 Hi,再把 World 换成 There。

示例 12:只在匹配行上替换 ​

bash
grep ERROR app.log | sed 's/ERROR/!!! ERROR !!!/'
text
2026-09-30 10:00:04 !!! ERROR !!! db connection failed
2026-09-30 10:00:07 !!! ERROR !!! timeout

先 grep 出错误行,再用 sed 给 ERROR 加高亮标记——三剑客常这么接力。

五、高频组合速记 ​

命令用途
sed 's/旧/新/g' 文件全局替换(输出到屏幕)
sed -i 's/旧/新/g' 文件直接改原文件
sed -i.bak 's/旧/新/g' 文件改原文件 + 备份(推荐)
sed -n '10,20p' 文件只看第 10-20 行
sed '/词/d' 文件删除含某词的行
sed 's/^/前缀 /'每行开头加内容
sed 's/$/后缀/'每行结尾加内容
sed -E 's/(..)/(..)/\2\1/'分组重排

六、RHEL 系与 Debian 系差异 ​

sed 属 GNU sed,两系基本一致。一个重要差异:

  • -i 备份写法:GNU sed(两系都是)用 -i.bak(中间无空格);BSD/macOS 的 sed 用 -i ''。在 Linux 上一律用 -i.bak 或 -i。
  • -E 两系都支持。

七、新手易错点 ​

  1. -i 直接改原文件:不加 -i 只改显示不存盘;加了就真改。批量操作前先预览。
  2. s/.../.../ 末尾别漏斜杠:少一个 / 就报语法错。
  3. 不加 g 只换每行第一个:想全换记得 g。
  4. sed 's/a/b' 不会停:它流式处理所有行,不是只处理一行。
  5. & 和 \1 只在替换部分有意义:它们引用匹配结果,不能随便乱用。
  6. 危险提示:sed -i 批量改文件不可逆,先备份、先预览;-i 后面别乱加空格。

八、相关命令与文档 ​