资讯动态

sed命令从入门到精通:替换、删除、插入、地址范围详解

发布时间:2026/10/9 2:53:52 来源:尧图企业网站定制
sed是 Linux 上的流式编辑器。它跟 vim 那种交互式编辑器不一样你写好一套编辑命令塞给它它就按这套规则把整个文件过一遍输出结果。批量改配置、日志脱敏、把一列数据换成另一列sed 是最顺手的工具。这一篇把替换、删除、插入、地址范围这几块核心用法讲透。一、语法格式sed [选项] 编辑命令 文件...整体套路是地址 编辑命令。地址决定对哪些行动手编辑命令决定怎么动。没写地址就是对每一行都执行。常用选项选项作用-n安静模式不自动打印每行只在显式p时才输出-e 命令接多条编辑命令可写多个-i原地修改文件GNU sedBSD/macOS 要写-i -E/-r使用扩展正则 ERE-f 脚本文件把编辑命令写在文件里执行二、替换命令 s///最常用的一招语法sed s/模式/替换串/标志 文件斜杠是分隔符模式和替换串里出现斜杠时可以换成别的字符比如#、|、逗号。标志位标志含义不写每行只替换第一次出现g替换一行里所有出现1、2、3...只替换第 N 次出现p替换成功后再打印这一行配合-n用w 文件把替换成功的行写到指定文件iGNU模式忽略大小写示例与预期输出继续用employees.csv101,张三,研发部,北京,18000 102,李四,研发部,上海,22000 103,王五,产品部,北京,25000 104,赵六,设计部,深圳,19000示例 1把所有北京换成Beijingsed s/北京/Beijing/g employees.csv预期输出101,张三,研发部,Beijing,18000 102,李四,研发部,上海,22000 103,王五,产品部,Beijing,25000 104,赵六,设计部,深圳,19000示例 2只把每行第一次出现的逗号换成|sed s/,/ | / employees.csv预期输出101 | 张三,研发部,北京,18000 102 | 李四,研发部,上海,22000 103 | 王五,产品部,北京,25000 104 | 赵六,设计部,深圳,19000注意每行只换了第一个逗号。想全部换就加g。示例 3用引用匹配到的整段把月薪两边加括号sed s/[0-9]\{4,\}/()/ employees.csv预期输出101,张三,研发部,北京,(18000) 102,李四,研发部,上海,(22000) 103,王五,产品部,北京,(25000) 104,赵六,设计部,深圳,(19000)在替换串里代表模式匹配到的那一段原文。这里 BRE 下{4,}要写成\{4,\}用sed -E就不用加反斜杠下面会对比。示例 4用反向引用重排字段把 CSV 的第 1 列和第 2 列位置互换sed -E s/^([0-9]),([^,]),/\2,\1,/ employees.csv预期输出张三,101,研发部,北京,18000 李四,102,研发部,上海,22000 王五,103,产品部,北京,25000 赵六,104,设计部,深圳,19000(...)在 ERE 里捕获分组\1、\2在替换串里引用。这是 sed 做列重排的经典写法。三、删除行 d语法sed 地址d 文件不写地址就是删全部写了地址就删命中的行。示例删除所有空行和注释行看配置文件常用sed /^$/d; /^#/d nginx.conf/^$/匹配空行/^#/匹配以#开头的注释行两条命令用分号隔开。删除第 2 行到第 4 行sed 2,4d employees.csv预期输出原来 4 行删完剩第 1 行101,张三,研发部,北京,18000删除从产品部开始到文件结尾的所有行sed /产品部/,$d employees.csv预期输出101,张三,研发部,北京,18000 102,李四,研发部,上海,22000四、插入 i、追加 a、替换行 c这三条命令用来往文件里加行或替换整行命令作用i\文本在命中行之前插入一行a\文本在命中行之后追加一行c\文本把命中的行替换成新文本示例在所有研发部记录后面加一行分隔符sed /研发部/a\--- employees.csv预期输出101,张三,研发部,北京,18000 --- 102,李四,研发部,上海,22000 --- 103,王五,产品部,北京,25000 104,赵六,设计部,深圳,19000在第一行前面加 CSV 表头sed 1i\工号,姓名,部门,城市,月薪 employees.csv预期输出工号,姓名,部门,城市,月薪 101,张三,研发部,北京,18000 102,李四,研发部,上海,22000 103,王五,产品部,北京,25000 104,赵六,设计部,深圳,19000GNU sed 允许把\省略写成1i 工号,...但 BSD sed 必须保留\并换行写。跨平台脚本里这点最烦。五、地址范围到底对哪些行动手地址是 sed 的灵魂。掌握下面这几种写法能应付 90% 的场景地址写法含义5第 5 行$最后一行1,5第 1 到第 5 行闭区间2,$第 2 行到结尾/error/所有含 error 的行/error/,/warn/从第一个 error 行到第一个 warn 行开区间配对1,/产品部/从第 1 行到第一个含产品部的行!取反比如5!d表示除了第 5 行全删示例从一个标记到另一个标记把 app.log 里从 START 到 END 之间的行删掉sed / START /,/ END /d app.log这种按范围删块的写法比手动数行号靠谱得多日志里经常用。取反! 的用法只保留第 1 行其他全删等价于sed 1!d employees.csv六、原地编辑 -i直接改文件前面所有示例都没动原文件sed 只往屏幕上吐结果。想真正写回文件GNU sedLinux 默认sed -i s/北京/Beijing/g employees.csvBSD sedmacOS 默认sed -i s/北京/Beijing/g employees.csv那个空字符串是备份文件后缀。写表示不备份。如果写成sed -i .bak原文件会被改另留一份employees.csv.bak。强烈建议第一次改文件时带备份后缀sed -i.bak s/北京/Beijing/g employees.csv改完 diff 一下确认没问题再把.bak删掉。sed 没有撤销错了就回不来了。七、多条编辑命令一起上改一个配置文件通常要改好几处用-e串起来sed -e s/^#Port 22/Port 2222/ -e s/^#PermitRootLogin.*/PermitRootLogin no/ sshd_config或者用分号写在一对引号里sed s/^#Port 22/Port 2222/; s/^#PermitRootLogin.*/PermitRootLogin no/ sshd_config编辑命令多了以后写进一个脚本文件更清楚# clean.sed s/^#// s/^$// s/foo/bar/g执行sed -i -f clean.sed app.conf八、⚠️ 常见错误BRE 下、?、|、{}当字面字符。写sed s/ab/x/想匹配一个或多个 a结果它只匹配字面的ab。要么加-E要么写成a\b。macOS 上sed -i直接报错。sed -i s/a/b/ file在 macOS 上会把s/a/b/当成备份后缀。跨平台脚本统一写sed -i.bak最稳。忘了g标志只换第一处。文件里一行出现 3 次北京不加g只换第一个。在替换串里有特殊含义。想输出字面的要写\否则它会被展开成匹配到的整段。地址范围错把空行删了。1,$d是删全部1d; $d是删首尾。新手常把分号和逗号搞混逗号是范围分号是两条命令。九、原理探究模式空间和保留空间到底是什么sed 名字里的 stream editor 不是白叫的。它处理文件的方式和你想的可能不一样模式空间pattern spacesed 每次读一行放进一块临时缓冲区所有编辑命令都在这块缓冲区上执行。执行完把缓冲区内容输出再读下一行。保留空间hold space另一块长期保存数据的缓冲区用得少但能玩出花。这就解释了为什么 sed 的命令是一条条作用在当前行上也解释了为什么下面这种两行合并成一行的操作要绕一下sed -n N; s/\n/ /p employees.csvN命令把下一行追加到模式空间里用换行连接然后s/\n/ /把换行换成空格最后p打印。没有-n的话sed 还会在读完一行后自动打印一次结果就重复了。理解了一次一行过、命令都在当前行上生效这个模型再看h复制到保留空间、g取回保留空间、x交换这些高级命令就不会觉得它们在变魔术了。日常用不上没关系知道有这两块缓冲区就行。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑