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% 的日常文本处理任务都能高效完成。对于更复杂的需求(如跨行处理),可结合 awkperl

相关推荐
山顶望月1 小时前
ISO20000与IT运维和运营的关系
运维·it运营·iso20000
杰锅就是爱情3 小时前
OpenObserve Ubuntu部署
linux·运维·ubuntu
lllsure4 小时前
【Docker】容器
运维·docker·容器
Jtti6 小时前
新加坡服务器连接速度变慢应该做哪些检查
运维·服务器
郝亚军6 小时前
websocket 服务器往客户端发送的数据要加掩码覆盖吗?
服务器·网络·websocket
DoWhatUWant6 小时前
域格YM310 X09移芯CAT1模组HTTPS连接服务器
服务器·网络协议·https
huangjiazhi_6 小时前
在Linux上无法访问usb视频设备
linux·运维·服务器
xixingzhe26 小时前
jenkins脚本触发部署
运维·jenkins
TTGGGFF6 小时前
云端服务器使用指南:如何跨机传输较大文件(通过windows自带工具远程桌面连接 非常方便)
运维·服务器
躲在云朵里`7 小时前
ElasticSearch复习指南:从零搭建一个商品搜索案例
运维·jenkins