
1. Shell脚本中的sed命令概述sedStream Editor是Linux/Unix系统中一个强大的流式文本编辑器它通过简洁的命令实现对文本的非交互式编辑。与vim等交互式编辑器不同sed特别适合在脚本中进行批量文本处理。RHCSE认证考试中sed是Shell脚本部分的重点考察对象主要测试考生对文本模式匹配和转换的掌握程度。我第一次在生产环境使用sed是为了批量修改500多台服务器的配置文件。当时需要将所有的Timeout300改为Timeout600手动操作根本不现实。sed配合for循环只用一行命令就解决了问题这让我深刻体会到它的威力。注意sed默认不会直接修改原文件而是将处理结果输出到标准输出。要直接修改文件需要显式使用-i选项。2. sed基础语法与工作模式2.1 基本命令格式sed的标准调用格式如下sed [选项] 地址范围/操作命令/参数 文件名一个实际的替换示例# 将file.txt中所有的old替换为new sed s/old/new/g file.txt选项部分常用的有-n静默模式只输出处理过的行-i直接修改文件内容危险但实用-e连接多个编辑命令2.2 地址范围详解sed的强大之处在于它可以精确控制处理哪些行单行处理sed 5s/pattern/replace/ file # 只处理第5行行范围处理sed 10,20s/pattern/replace/ file # 处理10到20行模式匹配sed /start/,/end/s/pattern/replace/ file # 处理从包含start到包含end的所有行步进选择sed 1~2s/pattern/replace/ file # 处理所有奇数行(1,3,5...)2.3 常见操作命令命令功能示例s替换s/old/new/gp打印5p (打印第5行)d删除/pattern/da追加5a\text (在第5行后追加)i插入/pattern/i\text (在匹配行前插入)c整行替换/pattern/c\newline3. sed高级应用技巧3.1 分组与反向引用sed支持使用\(\)进行分组匹配并通过\1,\2等引用# 将姓 名格式改为名, 姓 echo 张 三 | sed s/\([^ ]*\) \([^ ]*\)/\2, \1/ # 输出三, 张这个技巧在重排日志格式时特别有用。我曾经用这个功能将Apache日志从通用日志格式(CLF)转换为组合日志格式(Combined)。3.2 多命令组合使用-e可以组合多个命令或者用分号分隔# 两种多命令组合方式 sed -e s/foo/bar/ -e s/baz/qux/ file sed s/foo/bar/; s/baz/qux/ file更复杂的例子同时执行替换和删除# 将包含error的行中的old替换为new并删除所有空行 sed /error/s/old/new/g; /^$/d logfile3.3 保持空间与模式空间sed有两个缓冲区模式空间处理当前行的临时工作区保持空间长期存储的缓冲区相关命令h/H将模式空间复制/追加到保持空间g/G将保持空间复制/追加到模式空间x交换两个空间内容示例反转文件行序sed -n 1!G;h;$p file.txt4. 实战案例解析4.1 日志文件处理处理Nginx访问日志提取特定时间段的请求# 提取2023-01-15 14:00到15:00的日志 sed -n /15\/Jan\/2023:14:[0-5][0-9]:[0-5][0-9]/,/15\/Jan\/2023:15:[0-5][0-9]:[0-5][0-9]/p access.log4.2 配置文件批量修改批量修改多台服务器的SSH配置# 禁用root登录并修改端口 sed -i s/^#PermitRootLogin.*/PermitRootLogin no/; s/^#Port 22/Port 2222/ /etc/ssh/sshd_config4.3 数据清洗与转换清理CSV文件中的非法字符# 移除所有非打印字符将多个连续逗号变为单个 sed -e s/[[:cntrl:]]//g -e s/,,\/,/g data.csv clean.csv5. 常见问题与解决方案5.1 特殊字符处理处理包含斜杠的字符串时可以使用其他分隔符# 替换路径中的/usr/local为/opt sed s|/usr/local|/opt|g config.file5.2 性能优化技巧处理大文件时尽量使用地址范围缩小处理范围避免不必要的分组和反向引用将多个操作合并到一个sed命令中5.3 备份策略使用-i选项时建议同时指定备份后缀# 修改文件并自动创建.bak备份 sed -i.bak s/old/new/ file6. RHCSE考试重点解析根据多年经验RHCSE考试中sed部分常考基本替换操作s命令行寻址技巧数字范围、模式匹配多命令组合使用文件原地修改-i选项分组和反向引用典型考题示例 将/etc/passwd中所有用户的shell从/bin/bash改为/bin/sh但保留root用户不变解决方案sed /^root/!s/\/bin\/bash$/\/bin\/sh/ /etc/passwd7. 个人实战经验分享在多年的Linux系统管理工作中我总结了几个sed的黄金法则先测试再修改永远先不加-i运行命令确认输出符合预期后再实际修改文件使用版本控制对重要配置文件的修改即使使用sed也应该先提交到git或备份注释复杂命令在脚本中使用复杂sed命令时一定要添加注释说明其作用性能考量处理超过100MB的文件时考虑使用awk或专门工具替代一个真实案例有次我需要从数千个HTML文件中提取特定div内容。最初尝试用sed但当文件很大时性能很差。后来改用# 对小文件使用sed sed -n /div idcontent/,/\/div/p file.html # 对大文件改用专门的HTML解析工具这个经验告诉我工具要因地制宜sed虽强但不是万能的。