如何使用sed实现文本行指定前缀统一补全固定内容
问题原因分析
你最初的命令失效是因为匹配规则里的[^M]会实际匹配并消耗_10090后的第一个非M字符,替换时没有把这个字符加回去,就出现了首字符丢失的问题。
解决方案
方案1:修复原分步替换逻辑
用sed的捕获组功能保留被匹配到的非M字符,修改后的命令如下:
- 补全缺失的
Mus musculus:
sed 's/_10090 \([^M]\)/_10090 Mus musculus \1/g'
其中\1就是被[^M]匹配到的字符,替换时会原样放回。
- 再补全缺失的
(house mouse):
sed 's/Mus musculus \([^(]\)/Mus musculus (house mouse) \1/g'
可以合并为单次执行:
sed -e 's/_10090 \([^M]\)/_10090 Mus musculus \1/g' -e 's/Mus musculus \([^(]\)/Mus musculus (house mouse) \1/g' 目标文件路径
方案2:通用全适配方案
如果不需要分步判断缺失内容,无论行内物种信息缺多少都可以直接输出标准格式,可以用更简洁的正则直接重组行结构:
sed -E 's/^([0-9]+_10090).*(Gene [0-9]+)$/\1 Mus musculus (house mouse) \2/' 目标文件路径
该命令会直接提取每行开头的序号和末尾的基因标识,中间自动拼接固定的物种全称,适配所有缺失场景。
输出结果
两种方案运行后都会得到你期望的输出:
1_10090 Mus musculus (house mouse) Gene 1 2_10090 Mus musculus (house mouse) Gene 2 3_10090 Mus musculus (house mouse) Gene 3 4_10090 Mus musculus (house mouse) Gene 4
内容的提问来源于stack exchange,提问作者Billy Mills
相关产品推荐
相关产品推荐

