43·Shell 脚本进阶进阶

sed 流编辑器基础

sedtext-processing

第43课:sed 流编辑器基础

学习目标

通过本课的学习,你将能够:

  1. 理解 sed 命令的基本工作原理和语法结构
  2. 掌握 sed 的常用选项(如 -n, -i, -e
  3. 使用地址范围和正则表达式精准定位文本行
  4. 熟练运用 sed 的基本操作命令(替换 s、删除 d、打印 p
  5. 编写简单的 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
  1. 只保留包含 [INFO] 的行
  2. 删除第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
  1. 将所有配置项的 = 替换为 =(等号两边加空格)
  2. 删除所有以 # 开头的注释行
  3. 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

小结

关键要点回顾

  1. sed 工作原理:流式处理,逐行读取 → 存入模式空间 → 应用命令 → 输出结果
  2. 基本语法sed [选项] '地址命令' 文件
  3. 地址定位:行号、行号范围、正则模式、特殊符号($最后一行)
  4. 常用命令
    • s:替换(最常用)
    • d:删除
    • p:打印(常与 -n 配合)
    • i:插入
    • a:追加
  5. 重要选项-n 控制输出,-i 修改文件,-r 使用扩展正则

何时使用 sed?

  • 文本替换:批量修改配置文件、日志处理
  • 删除行:清理文件、过滤特定内容
  • 自动化处理:在脚本中处理文本流
  • 快速编辑:不用打开编辑器就能修改文件

sed 是文本处理的瑞士军刀,掌握基础用法后,你将能够高效地处理各种文本文件。下一课我们将学习 sed 的高级替换技巧和多行处理,让你能够处理更复杂的文本操作场景。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「sed 高级替换与多行处理」 以巩固所学知识。