Linux 中替换sed

以下是关于 sed(Stream Editor)的深度详解和日常高频使用场景,结合实用示例说明:


一、sed 核心概念

  • 流式编辑器 :逐行处理文本,不直接修改源文件(除非使用 -i 选项)
  • 正则支持 :基础正则(BRE)和扩展正则(ERE,需加 -r 或 -E)
  • 核心原理:读取 → 模式匹配 → 执行命令 → 输出

二、基础语法格式

bash 复制代码
sed [选项] '地址范围/命令/参数' 文件

三、高频使用场景与示例

1. 文本替换
bash 复制代码
# 替换每行第一个匹配项
sed 's/old/new/' file.txt

# 全局替换(所有匹配项)
sed 's/old/new/g' file.txt

# 替换第N次出现的匹配
sed 's/old/new/2' file.txt          # 只替换每行第二个匹配

# 替换时忽略大小写(GNU sed扩展)
sed 's/old/new/i' file.txt
2. 删除行
bash 复制代码
# 删除空行
sed '/^$/d' file.txt

# 删除注释行(以#开头)
sed '/^#/d' config.conf

# 删除特定范围行
sed '10,20d' file.txt               # 删除10-20行
sed '/start/,/end/d' file.txt       # 删除两个模式间的行
3. 插入/追加行
bash 复制代码
# 在第3行前插入文本
sed '3i\插入的内容' file.txt

# 在匹配行后追加
sed '/pattern/a\追加的内容' file.txt

# 文件开头/结尾插入
sed '1i\开头内容' file.txt
sed '$a\结尾内容' file.txt
4. 行筛选打印
bash 复制代码
# 打印含"error"的行(类似grep)
sed -n '/error/p' log.txt

# 打印行号范围
sed -n '10,15p' file.txt

# 打印奇数行
sed -n '1~2p' file.txt              # 1,3,5...
5. 文件原地修改
bash 复制代码
# 直接修改文件(先测试!)
sed -i.bak 's/old/new/g' file.txt   # 备份原文件为file.txt.bak
sed -i '' 's/old/new/g' file.txt    # macOS下无备份修改
6. 高级替换技巧
bash 复制代码
# 引用匹配内容
echo "123 abc" | sed 's/[0-9]\+/[&]/'    # 输出 "[123] abc"

# 分组捕获(使用\1,\2引用)
echo "foo-bar" | sed 's/\(foo\)-\(bar\)/\2-\1/'  # 输出 "bar-foo"

# 条件替换(仅对匹配行操作)
sed '/warning/s/foo/bar/' log.txt     # 只在含"warning"的行替换foo
7. 多命令组合
bash 复制代码
# 用分号分隔多个命令
sed 's/foo/bar/g; s/baz/qux/g' file.txt

# 或用-e选项
sed -e 's/foo/bar/' -e '/baz/d' file.txt

四、日常实用案例

1. 日志处理
bash 复制代码
# 提取时间戳和错误信息
sed -n '/ERROR/{s/.*\(202[0-9]-[0-9]\{2\}-[0-9]\{2\}\).*\(ERROR:.*\)/\1 \2/p}' app.log

# 统计HTTP状态码
sed -n 's/.*HTTP\/1\.[01]" \([0-9]\{3\}\).*/\1/p' access.log | sort | uniq -c
2. 配置文件修改
bash 复制代码
# 注释掉某配置项
sed -i '/^SELINUX=/s/^/#/' /etc/selinux/config

# 修改键值对
sed -i 's/^\(PORT=\).*/\13306/' config.ini
3. 数据清洗
bash 复制代码
# CSV转TSV
sed 's/,/\t/g' data.csv

# 删除HTML标签
sed 's/<[^>]*>//g' page.html
4. 批量重命名
bash 复制代码
# 测试重命名命令
ls *.jpg | sed 's/\(.*\)\.jpg/mv & \1_backup.jpg/'

# 实际执行(先确认输出无误)
ls *.jpg | sed 's/\(.*\)\.jpg/mv & \1_backup.jpg/' | bash
5. 代码处理
bash 复制代码
# 缩进所有行(前加4空格)
sed 's/^/    /' source.py

# 删除行尾空格
sed 's/[[:space:]]*$//' file.txt

五、sed 调试技巧

  1. 先不加 -i :测试时输出到屏幕确认效果

    bash 复制代码
    sed 's/pattern/replace/' file.txt
  2. 打印处理的行 :

    bash 复制代码
    sed -n 's/foo/bar/p' file.txt     # 只显示被修改的行
  3. 使用 & 调试 :

    bash 复制代码
    sed 's/pattern/& ==> replaced/' file.txt  # 标记被替换的内容

六、性能优化建议

  1. 合并多个操作 :减少管道和多次读取

    bash 复制代码
    # 低效
    cat file | sed 's/foo/bar/' | sed '/baz/d'
    # 高效
    sed -e 's/foo/bar/' -e '/baz/d' file
  2. 限制处理范围 :用地址范围减少处理行数

    bash 复制代码
    sed '100,200s/foo/bar/' largefile.txt

掌握这些 sed 技巧后,90% 的日常文本处理任务都能高效完成。对于更复杂的需求(如跨行处理),可结合 awk 或 perl。

相关推荐
Decay__2 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
贞明电子4 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
HideF5 小时前
Linux
linux·服务器·网络
万联WANFLOW5 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
Ruiery7 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
乌恩大侠8 小时前
从 AI-RAN 到 AI Agent:基于 NVIDIA Nemotron 构建 5G/6G 智能网络故障诊断系统
服务器·人工智能·5g·o-ru·ai-ran·电信大模型
Decay__8 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
丰锋ff9 小时前
压缩命令笔记
linux
江华森10 小时前
数据中心基础设施运维实战:概述与实验环境搭建
运维
迪菲赫尔曼10 小时前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测