想把注释文件里几万行的 chr 前缀全去掉、把逗号统一换成制表符、或者只抽中间几行——用编辑器打开几个 G 的文件根本卡死,手动改更不现实。sed 是流式编辑器,数据像流水一样过一遍就改完,不用整个加载进内存。它最常用的就是替换和按行操作,命令短、组合灵活,配合管道几乎能搞定所有纯文本批处理。这一讲把 sed 的常用法一次理清:替换、按行打印、删除、插入追加、字符转换、多规则组合,照着改改就能套到自己的数据上。
sed 怎么工作
sed 逐行读入、按规则改、再输出,全程不把整个文件读进内存,所以多大的文件都能处理。最高频的就是 s/旧/新/ 替换,末尾加 g 表示一行内全部替换。
核心命令速查
下面按「替换 / 按行打印 / 删除 / 插入转换 / 组合」分组,示例文件在 testdata 里:
#!/bin/bash# sed 流编辑常用命令速查,按需复制F=testdata/genes.txt# ---- 替换 ----sed 's/chr//'"$F"# 替换每行第一个 chrsed 's/chr//g'"$F"# 一行内全部替换sed 's/^chr//'"$F"# 只替换行首的 chrsed 's/,/\t/g'"$F"# 逗号转制表符sed 's/[0-9]\+//g'"$F"# 删掉所有数字sed 's|/path|/data|g'"$F"# 路径多用 | 当分隔符,免转义# ---- 按行打印 ----sed -n '2p'"$F"# 只打印第 2 行sed -n '2,4p'"$F"# 打印 2-4 行sed -n '$p'"$F"# 打印最后一行sed -n '/TP53/p'"$F"# 打印含 TP53 的行# ---- 删除 ----sed '1d'"$F"# 删第 1 行(去表头)sed '$d'"$F"# 删最后一行sed '/^$/d'"$F"# 删空行sed '/KRAS/d'"$F"# 删含 KRAS 的行# ---- 插入 / 追加 / 转换 ----sed '1i\#header'"$F"# 第 1 行前插入sed '1a\---'"$F"# 第 1 行后追加sed 'y/atcg/ATCG/'"$F"# 碱基逐字符转大写sed 's/\(chr[0-9X]\).*/\1/'"$F"# 捕获组:只留染色体号# ---- 组合 ----sed -e 's/^chr//' -e '/^$/d'"$F"# 多条规则一次跑
s/旧/新/g 全替、^ 锚行首;-n 配 p 只打印指定行;/^$/d 删空行;y/// 逐字符转换;\(...\) 是捕获组。
示例的输出日志
对示例文件跑几个代表招式,效果如下:
--- 去 chr 前缀 ---1,1000,2000,TP532,3000,4000,EGFR3,5000,6000,KRASX,7000,8000,BRCA11,9000,9500,MYC--- 打印 2-4 行 ---chr2,3000,4000,EGFRchr3,5000,6000,KRAS--- 删空行 ---chr1,1000,2000,TP53chr2,3000,4000,EGFRchr3,5000,6000,KRASchrX,7000,8000,BRCA1chr1,9000,9500,MYC--- 逗号转制表符 ---chr1 1000 2000 TP53chr2 3000 4000 EGFRchr3 5000 6000 KRASchrX 7000 8000 BRCA1chr1 9000 9500 MYCOK
chr 前缀去掉、中间几行抽出、空行删掉、逗号换成制表符——流式处理,原文件不动。
扩展:原位修改与脚本化
确认规则没问题后想直接改源文件,务必带 .bak 备份;规则多就写进文件:
# 原位把 chr 去掉,同时存一份 .bak 备份sed -i.bak 's/^chr//' testdata/genes.txt# 多条规则写进 .sed 文件,用 -f 调用printf's/^chr//\n/^$/d\n' > rules.sedsed -f rules.sed testdata/genes.txt
-i 不可逆,.bak 是后悔药;规则多就写进 .sed 文件用 -f 调用,干净可复用。
避坑指南
- 替换没生效 → 特殊字符(/ & .)要转义,或换分隔符
s|a|b| - Mac 上
-i 语法不同 → 需写成 sed -i '' ...
📦 完整代码 + 测试数据下载
百度网盘链接:https://pan.baidu.com/s/1n7jN-90APGzH9h21-lOYGw?pwd=l06c
提取码:l06c(代码已实测可直接运行,建议保存到自己网盘)