第43课:sed 流编辑器基础
学习目标
通过本课的学习,你将能够:
- 理解
sed命令的基本工作原理和语法结构 - 掌握
sed的常用选项(如-n,-i,-e) - 使用地址范围和正则表达式精准定位文本行
- 熟练运用
sed的基本操作命令(替换s、删除d、打印p) - 编写简单的
sed脚本进行批量文本处理
核心概念
什么是 sed?
sed(Stream EDitor)是一个非交互式的流编辑器。你可以把它想象成一个高效的文本处理流水线:它从输入(文件或管道)读取文本,根据你的指令逐行处理,然后将结果输出到标准输出(屏幕)或文件。
核心特点:
- 流式处理:一行接一行处理,内存占用小
- 非交互:适合脚本和自动化任务
- 模式空间:
sed内部会维护一个“模式空间”,当前处理的行就放在这里,所有操作都针对这个空间进行
基本语法结构
sed [选项] '命令' 文件名
# 或者通过管道接收输入
echo "hello world" | sed 's/world/Linux/'
常用选项
| 选项 | 说明 |
|---|---|
-n | 抑制默认输出(常与 p 命令配合使用) |
-i | 直接修改原文件(危险操作,建议先备份) |
-e | 指定多个编辑命令 |
-r 或 -E | 使用扩展正则表达式 |
地址(Address)
地址决定了 sed 命令作用在哪些行上:
# 语法:[地址]命令
# 示例:
sed '3d' file.txt # 删除第3行
sed '1,5d' file.txt # 删除第1到5行
sed '/pattern/d' file.txt # 删除包含pattern的行
代码示例
1. 基础替换
# 创建示例文件
echo -e "Hello World\nHello Sed\nLinux is great" > demo.txt
# 替换第一个匹配项
sed 's/Hello/Hi/' demo.txt
# 输出:
# Hi World
# Hi Sed
# Linux is great
# 全局替换(每行所有匹配)
sed 's/Hello/Hi/g' demo.txt
# 使用不同的分隔符(处理路径时很方便)
sed 's/\/usr\/local/\/opt/' demo.txt
# 更清晰的写法:
sed 's#/usr/local#/opt#' demo.txt
2. 使用地址范围
# 只替换第2行
sed '2s/Hello/Hi/' demo.txt
# 替换第2到3行
sed '2,3s/Hello/Hi/' demo.txt
# 替换从包含"Sed"的行到文件末尾
sed '/Sed/,$s/Hello/Hi/' demo.txt
3. 删除行
# 删除包含"Linux"的行
sed '/Linux/d' demo.txt
# 删除空行
sed '/^$/d' demo.txt
# 删除第1行和最后一行
sed '1d;$d' demo.txt
4. 打印特定行
# 只打印包含"Sed"的行(-n 抑制默认输出)
sed -n '/Sed/p' demo.txt
# 打印第2到4行
sed -n '2,4p' file.txt
5. 直接修改文件(谨慎使用)
# 备份原文件后再修改
sed -i.bak 's/Hello/Hi/g' demo.txt
# 这会生成 demo.txt(已修改)和 demo.txt.bak(备份)
# 不创建备份直接修改(危险!)
sed -i 's/Hello/Hi/g' demo.txt
实践练习
练习1:基础替换
创建一个包含以下内容的文件 emails.txt:
使用 sed 将所有 .com 替换为 .net,并打印结果。
预期输出:
练习2:地址范围与删除
创建一个日志文件 app.log:
[INFO] 2024-01-01 System started
[DEBUG] 2024-01-01 Loading configuration
[INFO] 2024-01-01 Database connected
[ERROR] 2024-01-02 Connection timeout
[WARN] 2024-01-02 High memory usage
[INFO] 2024-01-03 Backup completed
- 只保留包含
[INFO]的行 - 删除第3行到第5行
练习3:综合练习
创建一个配置文件 config.txt:
# Database settings
DB_HOST=localhost
DB_PORT=3306
DB_NAME=myapp
DB_USER=admin
DB_PASS=secret123
# Server settings
SERVER_PORT=8080
DEBUG=true
- 将所有配置项的
=替换为=(等号两边加空格) - 删除所有以
#开头的注释行 - 将
DEBUG=true改为DEBUG=false
常见错误
1. 忘记 -i 选项导致文件未被修改
# 错误:这样只会输出到屏幕,原文件不变
sed 's/Hello/Hi/g' demo.txt
# 正确:使用 -i 修改文件
sed -i 's/Hello/Hi/g' demo.txt
2. 地址范围写法错误
# 错误:缺少逗号
sed '1 5d' file.txt
# 正确
sed '1,5d' file.txt
# 错误:在地址中使用正则但没转义特殊字符
sed '/file.txt/d' config.txt
# 正确:转义点号
sed '/file\.txt/d' config.txt
3. 在替换命令中忘记全局标志
# 只替换每行第一个匹配
sed 's/Hello/Hi/' file.txt
# 替换每行所有匹配
sed 's/Hello/Hi/g' file.txt
4. 混淆 -n 选项的作用
# -n 抑制默认输出,只有明确用 p 命令才会打印
sed -n '/pattern/p' file.txt # 正确
# 如果不用 -n,会打印所有行加上匹配行的重复打印
sed '/pattern/p' file.txt # 可能不是你想要的结果
5. 在脚本中错误使用变量
# 错误:单引号内变量不被解释
PATTERN="error"
sed -n '/$PATTERN/p' log.txt
# 正确:使用双引号或转义
sed -n "/$PATTERN/p" log.txt
# 或者
sed -n '/'"$PATTERN"'/p' log.txt
小结
关键要点回顾
- sed 工作原理:流式处理,逐行读取 → 存入模式空间 → 应用命令 → 输出结果
- 基本语法:
sed [选项] '地址命令' 文件 - 地址定位:行号、行号范围、正则模式、特殊符号(
$最后一行) - 常用命令:
s:替换(最常用)d:删除p:打印(常与-n配合)i:插入a:追加
- 重要选项:
-n控制输出,-i修改文件,-r使用扩展正则
何时使用 sed?
- 文本替换:批量修改配置文件、日志处理
- 删除行:清理文件、过滤特定内容
- 自动化处理:在脚本中处理文本流
- 快速编辑:不用打开编辑器就能修改文件
sed 是文本处理的瑞士军刀,掌握基础用法后,你将能够高效地处理各种文本文件。下一课我们将学习 sed 的高级替换技巧和多行处理,让你能够处理更复杂的文本操作场景。
练习编辑器
rust
Loading...