简介

sed(流编辑器)是一个强大的文本处理工具,它可以对输入流(文件或管道)执行基本的文本转换操作。本指南将帮助您掌握sed的各种用法,从基础替换到高级文本处理。

主要特点:
  • 支持正则表达式
  • 可以直接修改文件
  • 支持复杂的文本替换和删除操作
  • 可以处理多行文本

基本用法

基本语法

sed [选项] '命令' 文件

常用选项

选项 说明 示例
-i 直接修改文件 sed -i 's/old/new/g' file.txt
-e 执行多个命令 sed -e 's/a/A/' -e 's/b/B/' file.txt
-n 抑制自动打印 sed -n 'p' file.txt

基本命令

替换文本:

sed 's/old/new/' file.txt

删除行:

sed '/pattern/d' file.txt

打印特定行:

sed -n '1,5p' file.txt

高级特性

多行处理

处理多行模式:

sed '/start/,/end/s/old/new/g' file.txt

合并行:

sed ':a;N;$!ba;s/\n/ /g' file.txt

保持空间操作

使用保持空间:

sed 'H;1h;$!d;x;s/\n/,/g' file.txt
高级功能说明:
  • N:将下一行加入到模式空间
  • H:将模式空间追加到保持空间
  • x:交换模式空间和保持空间
  • D:删除模式空间第一行

实用案例

配置文件修改

修改配置值:

sed -i 's/^PORT=.*/PORT=8080/' config.conf

添加新配置:

sed -i '/^#END/i NEW_OPTION=value' config.conf

日志处理

提取特定时间段的日志:

sed -n '/2024-12-11 10:00/,/2024-12-11 11:00/p' access.log

删除调试信息:

sed '/DEBUG:/d' app.log

批量重命名

ls | sed 's/\.txt$/.bak/' | xargs -I {} mv {}.txt {}.bak

正则表达式

基本正则表达式

模式 说明 示例
^ 行首 sed 's/^#//'
$ 行尾 sed 's/$/;/'
.* 任意字符 sed 's/foo.*/bar/'
\(pattern\) 分组 sed 's/\(foo\)bar/\1/'
注意:

在使用扩展正则表达式时,需要使用-E选项或在正则表达式中转义特殊字符。

最佳实践

安全性考虑

注意事项:
  • 使用-i前先测试命令
  • 处理重要文件时创建备份
  • 注意正则表达式的转义

性能优化

优化建议:
  • 使用-i时添加备份后缀
  • 处理大文件时使用临时文件
  • 合并多个sed命令减少文件读写

实用脚本

批量替换带备份:

sed -i.bak 's/old/new/g' *.txt

合并多个操作:

sed -i -e 's/foo/bar/g' -e 's/baz/qux/g' -e '/^#/d' file.txt