1. 命令概述
- 命令名称:
sed(英文全拼:stream editor) - 核心功能:流编辑器,对文本进行流式处理
- 主要用途:文本替换、删除、插入、打印等操作
- 特点:非交互式、支持正则表达式、高效处理大文件
2. 语法格式
sed [选项] '命令' 文件...
sed [选项] -f 脚本文件 文件...
3. 常用选项
| 选项 | 说明 |
|---|---|
-n | 只显示处理后的行 |
-e | 执行多个编辑命令 |
-f | 从脚本文件读取命令 |
-i | 直接修改文件内容 |
-r | 使用扩展正则表达式 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
4. 基本操作
(1) 基本替换
# 替换每行的第一个匹配项
sed 's/old/new/' file.txt
# 替换所有匹配项
sed 's/old/new/g' file.txt
# 替换第2个匹配项
sed 's/old/new/2' file.txt
# 替换第2到第4个匹配项
sed 's/old/new/2,4' file.txt
(2) 指定行范围
# 替换第5行的内容
sed '5s/old/new/' file.txt
# 替换第5到第10行的内容
sed '5,10s/old/new/' file.txt
# 替换第5行到文件末尾的内容
sed '5,$s/old/new/' file.txt
# 替换包含"pattern"的行
sed '/pattern/s/old/new/' file.txt
# 替换不包含"pattern"的行
sed '/pattern/!s/old/new/' file.txt
(3) 删除行
# 删除第5行
sed '5d' file.txt
# 删除第5到第10行
sed '5,10d' file.txt
# 删除包含"pattern"的行
sed '/pattern/d' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除注释行
sed '/^#/d' file.txt
(4) 插入和追加
# 在第5行前插入文本
sed '5i\插入的文本' file.txt
# 在第5行后追加文本
sed '5a\追加的文本' file.txt
# 在文件开头插入文本
sed '1i\开头的文本' file.txt
# 在文件末尾追加文本
sed '$a\结尾的文本' file.txt
(5) 打印行
# 打印第5行
sed -n '5p' file.txt
# 打印第5到第10行
sed -n '5,10p' file.txt
# 打印包含"pattern"的行
sed -n '/pattern/p' file.txt
# 打印不包含"pattern"的行
sed -n '/pattern/!p' file.txt
5. 常用实例详解
(1) 文本替换
# 替换所有"old"为"new"
sed 's/old/new/g' file.txt
# 替换每行的第一个"old"
sed 's/old/new/' file.txt
# 替换第2个"old"
sed 's/old/new/2' file.txt
# 替换第2到第4个"old"
sed 's/old/new/2,4' file.txt
# 替换第5行的"old"
sed '5s/old/new/' file.txt
# 替换第5到第10行的"old"
sed '5,10s/old/new/' file.txt
# 替换包含"pattern"的行中的"old"
sed '/pattern/s/old/new/' file.txt
# 替换不包含"pattern"的行中的"old"
sed '/pattern/!s/old/new/' file.txt
(2) 删除操作
# 删除第5行
sed '5d' file.txt
# 删除第5到第10行
sed '5,10d' file.txt
# 删除包含"pattern"的行
sed '/pattern/d' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除注释行
sed '/^#/d' file.txt
# 删除以空格开头的行
sed '/^[[:space:]]*$/d' file.txt
# 删除包含数字的行
sed '/[0-9]/d' file.txt
(3) 插入和追加
# 在第5行前插入文本
sed '5i\插入的文本' file.txt
# 在第5行后追加文本
sed '5a\追加的文本' file.txt
# 在文件开头插入文本
sed '1i\开头的文本' file.txt
# 在文件末尾追加文本
sed '$a\结尾的文本' file.txt
# 在包含"pattern"的行前插入
sed '/pattern/i\插入的文本' file.txt
# 在包含"pattern"的行后追加
sed '/pattern/a\追加的文本' file.txt
(4) 打印操作
# 打印第5行
sed -n '5p' file.txt
# 打印第5到第10行
sed -n '5,10p' file.txt
# 打印包含"pattern"的行
sed -n '/pattern/p' file.txt
# 打印不包含"pattern"的行
sed -n '/pattern/!p' file.txt
# 打印奇数行
sed -n '1~2p' file.txt
# 打印偶数行
sed -n '2~2p' file.txt
# 打印最后一行
sed -n '$p' file.txt
(5) 其他操作
# 转换大小写
sed 's/[a-z]/\U&/g' file.txt # 小写转大写
sed 's/[A-Z]/\L&/g' file.txt # 大写转小写
# 添加行号
sed = file.txt | sed 'N;s/\n/\t/'
# 删除行号
sed 's/^[0-9]*\t//' file.txt
# 合并连续空行
sed '/^$/{N;/^\n$/D}' file.txt
# 删除行尾空格
sed 's/[[:space:]]*$//' file.txt
# 删除行首空格
sed 's/^[[:space:]]*//' file.txt
6. 实际应用场景
场景一:配置文件处理
# 修改nginx配置文件
sed -i 's/listen 80;/listen 8080;/' /etc/nginx/nginx.conf
# 修改Apache配置文件
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
# 修改SSH配置
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
# 修改系统时区
sed -i 's/^ZONE=.*/ZONE="Asia\/Shanghai"/' /etc/sysconfig/clock
场景二:日志处理
# 提取错误日志
sed -n '/ERROR/p' app.log
# 提取特定时间段的日志
sed -n '/2023-12-19 1[0-9]:/p' access.log
# 提取IP地址
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' access.log
# 提取HTTP状态码
sed -n 's/.* \([2-5][0-9]\{2\}\) .*/\1/p' access.log
# 删除空行和注释行
sed -i '/^$/d;/^#/d' config.conf
场景三:代码处理
# 替换Python文件中的字符串
sed -i 's/old_function/new_function/g' *.py
# 替换C语言文件中的字符串
sed -i 's/old_variable/new_variable/g' *.c
# 替换Shell脚本中的路径
sed -i 's/\/old\/path/\/new\/path/g' *.sh
# 删除TODO注释
sed -i '/TODO/d' *.py
# 添加文件头注释
sed -i '1i\# -*- coding: utf-8 -*-' *.py
场景四:文本格式化
# 删除行尾空格
sed -i 's/[[:space:]]*$//' file.txt
# 删除行首空格
sed -i 's/^[[:space:]]*//' file.txt
# 删除空行
sed -i '/^$/d' file.txt
# 合并连续空行
sed -i '/^$/{N;/^\n$/D}' file.txt
# 添加行号
sed = file.txt | sed 'N;s/\n/\t/' > numbered.txt
# 转换行尾符(DOS转Unix)
sed -i 's/\r$//' file.txt
# 转换行尾符(Unix转DOS)
sed -i 's/$/\r/' file.txt
7. 与其他命令的区别
| 命令 | 特点 | 适用场景 |
|---|---|---|
sed | 流编辑器,支持正则表达式 | 文本替换、删除、插入 |
awk | 文本处理工具,支持字段处理 | 复杂文本处理、报表生成 |
grep | 文本搜索工具 | 模式匹配、搜索 |
cut | 按列提取文本 | 提取指定列 |
tr | 字符转换工具 | 字符替换、删除 |
8. 注意事项
- 正则表达式:
sed使用基本正则表达式,部分元字符需要转义 - 文件修改:使用
-i选项直接修改文件,建议先备份 - 性能优化:使用更精确的模式可以提高处理速度
- 多命令执行:使用
-e选项执行多个命令,或用分号分隔 - 脚本文件:使用
-f选项从文件读取命令
9. 常见问题解决
(1) 特殊字符转义
# 替换包含"/"的字符串
sed 's/\/old\/path/\/new\/path/g' file.txt
# 或者使用其他分隔符
sed 's|/old/path|/new/path|g' file.txt
# 替换包含"&"的字符串
sed 's/old\&new/old_and_new/g' file.txt
# 替换包含"+"的字符串
sed 's/old\+/old_plus/g' file.txt
# 替换包含"?"的字符串
sed 's/old\?/old_question/g' file.txt
(2) 性能优化
# 使用更精确的模式
sed 's/^old/new/' file.txt # 比 's/old/new/' 更快
# 使用地址范围
sed '5,10s/old/new/' file.txt # 只处理指定行
# 使用条件匹配
sed '/pattern/s/old/new/' file.txt # 只处理匹配的行
(3) 大文件处理
# 分块处理大文件
split -l 1000 largefile.txt chunk_
for chunk in chunk_*; do
sed 's/old/new/g' "$chunk" > "${chunk}_new"
done
# 或者使用其他工具
awk '{gsub(/old/, "new"); print}' largefile.txt > newfile.txt
(4) 多文件处理
# 批量处理多个文件
for file in *.txt; do
sed -i 's/old/new/g' "$file"
done
# 批量处理目录下的文件
find /path/to/dir -name "*.txt" -exec sed -i 's/old/new/g' {} \;
# 批量处理并备份
for file in *.txt; do
cp "$file" "${file}.bak"
sed 's/old/new/g' "$file" > "${file}.new"
done
核心要点总结:
sed是强大的流编辑器,支持正则表达式- 常用选项:
-n(只显示处理后的行)、-i(直接修改文件)、-e(执行多个命令) - 基本操作:替换(s)、删除(d)、插入(i)、追加(a)、打印(p)
- 实际应用:配置文件处理、日志处理、代码处理、文本格式化
- 注意事项:特殊字符需要转义,使用
-i前建议备份文件
sed命令是Linux系统管理员和开发者的必备工具,熟练掌握可以大大提高文本处理效率。