别再死记sed语法!这篇全实战教程,批量改文件/日志过滤/配置编辑,1行命令搞定- 批量修改N个配置文件,手动打开改到崩溃,还容易漏改、改错
- sed命令符号多、语法怪,记不住、写错参数直接把源文件改崩,还没法撤回
- 面试被问到sed实战题,只会基础替换,高阶用法一问三不知
Linux零基础小白、运维工程师、后端开发、测试工程师、校招/社招面试备考者
先搞懂sed的底层逻辑和基础规则,后续学命令事半功倍,全程大白话,无晦涩术语。sed全称Stream Editor(流编辑器),是一款非交互式文本处理工具——不用打开文件(比如vim、nano),就能批量对文本执行替换、删除、插入、查询等操作。核心优势:批量处理效率极高、适合脚本自动化、占用资源少,服务器远程操作无压力。sed处理文本的流程固定,理解这4步,再也不怕记混语法:逐行读取文本 → 匹配设定的规则 → 执行对应操作 → 输出结果(默认不修改源文件)- 模式空间:sed临时存放文本的区域,默认只输出处理结果,不改动源文件
- 源文件修改:必须加-i参数,才会把处理结果写入源文件(高危操作,慎⽤)
sed [选项参数] '匹配规则+操作动作' 目标文件名
- 测试命令:先不加-i参数,查看终端输出效果,没问题再加-i改源文件
- 分隔符替换:默认用/分隔,遇到路径(含/)时,可换成#、|、@等符号,避免冲突
- 快速查帮助:终端执行man sed,查看完整参数说明;按q退出帮助页面
- Mac系统适配:Mac版sed需用-i ''(空引号),才能修改源文件
二、核心高频命令:按场景分类,学完直接用(干货主体)本章按使用频率从高到低拆分,每个命令带格式+实战案例+代码注释+执行效果,全程可直接复制,贴合工作场景。 测试文件准备:新建test.txt,用于后续所有命令演示,内容如下:cat > test.txt << EOFHello LinuxHello SedLinux is powerfulSed isa good tooltest 123test 456EOF
替换是sed最核心功能,默认只替换每行第一个匹配项,加g参数实现全局替换。# 格式:sed 's/旧内容/新内容/' 文件名sed 's/Hello/Hi/' test.txt
执行效果:每行第一个Hello替换为Hi,源文件不变# 格式:sed 's/旧内容/新内容/g' 文件名sed 's/Linux/centos/g' test.txt
执行效果:全文所有Linux替换为centos,g=global(全局)# 替换第2行的Sed为SEDsed'2s/Sed/SED/' test.txt# 替换第1-3行的Hello为Hised '1,3s/Hello/Hi/' test.txt
# 错误写法:sed 's//usr/local//opt/g' test.txt# 正确写法sed 's#/usr/local#/opt#g' test.txt
sed -e 's/Hello/Hi/g' -e 's/Linux/CentOS/g' test.txt
模块2:必备——打印/查询操作(p命令,日志排查神器)配合-n参数使用,只打印目标内容,屏蔽默认输出,避免冗余信息。# 打印第2行sed -n '2p' test.txt# 打印第1-4行sed -n '1,4p' test.txt# 打印最后一行sed -n '$p' test.txt
# 打印含Sed的行sed -n '/Sed/p' test.txt# 打印含test的行,并显示行号sed -n '/test/=;/test/p' test.txt
# 打印除第3行以外的所有行sed '3d' test.txt# 打印不含test的行sed '/test/d' test.txt
高危警示:删除操作不可逆,测试时绝对不加-i参数,确认效果后再执行!# 删除第2行sed'2d' test.txt# 删除第3-5行sed '3,5d' test.txt
# 删除含test的行sed '/test/d' test.txt
模块4:进阶——插入/追加/整行修改(配置文件专用)适合编辑nginx、mysql等配置文件,批量添加注释、追加配置项。# 第2行前插入内容sed'2i# This is Sed tutorial' test.txt# 第3行后追加内容sed '3a# Linux command' test.txt# 匹配Sed的行后追加内容sed '/Sed/a# Stream Editor' test.txt
# 把第2行整行替换为Hi Sed Commandsed'2c Hi Sed Command' test.txt
# 行首添加#(批量注释)sed 's/^/#/' test.txt# 行尾添加 ;sed 's/$/;/' test.txt
模块5:高阶——正则扩展+反向引用(高效处理复杂文本)配合-r参数启用扩展正则,省去繁琐转义符,实现批量格式化文本。# 删除以test开头、数字结尾的行sed -r '/^test [0-9]+$/d' test.txt
用()分组,\1、\2调用分组内容,实现文本格式批量修改# 把 test 123 改为 123 testsed -r 's/(test) ([0-9]+)/\2 \1/g' test.txt
本章还原真实工作场景,所有命令可直接复制到服务器执行,解决日常痛点。# 1. 批量注释nginx配置文件(注释以listen开头的行)sed -i '/^listen/s/^/#/' nginx.conf# 2. 批量取消注释sed -i '/^#listen/s/^#//' nginx.conf# 3. 批量替换IP地址(192.168.1.100改为192.168.1.200)sed -i 's/192.168.1.100/192.168.1.200/g' config.ini
# 1. 提取日志中ERROR级别的日志,保存到新文件sed -n '/ERROR/p' app.log > error.log# 2. 删除日志中30天前的冗余日志(删除含2024-02的行)sed -i '/2024-02/d' app.log# 3. 实时过滤日志(配合tail使用)tail -f app.log | sed '/DEBUG/d'
# 1. 批量去除文件中的空格和制表符sed -i 's/[[:space:]]//g' test.txt# 2. 批量修改文件名后缀(.txt改为.md)ls *.txt | sed 's/\(.*\)\.txt/mv \1.txt \1.md/' | bash
# 自动化部署脚本片段,批量修改配置端口#!/bin/bashsed -i 's/port=8080/port=8090/g' /usr/local/app/config.iniecho"配置端口修改完成"
- -i参数无撤回:一旦执行sed -i修改源文件,无法恢复,务必先测试再执行
- 删除操作别盲目:执行d命令前,先用p命令查看匹配行,确认无误再删
- 别用sed修改二进制文件:sed只适用于文本文件,修改压缩包、图片会损坏文件
- sed 'p' 与 sed -n 'p':前者会重复打印,后者只打印目标行
- s/old/new/ 与 s/old/new/g:前者只替换首个匹配项,后者全局替换
- 普通正则与扩展正则:加-r参数省去\转义符,写法更简洁
- sed在线测试工具:网页端模拟执行,避免改坏本地文件
- Linux三剑客速查手册:sed+awk+grep一站式查询
sed的核心逻辑就是“匹配规则+执行动作”,不用死记硬背复杂语法,记住高频场景的命令模板,工作中直接套用即可。新手牢记:先测试、后修改,慎用-i参数。