Newick/Phylip进化树分支批量标记的sed命令实现问题
问题原因
你之前写的命令无法生效主要有两个问题:
- 引号嵌套错误,模式匹配部分的额外单引号导致sed解析失败
- 替换逻辑错误,直接替换
Dog字符串会把物种名覆盖,而非在分支长度后追加标记
可行实现方案
1. 单物种加标记(适配任意分支长度)
利用sed的捕获组匹配「物种名+冒号+任意数值」的整体,再在后面追加标记即可,通用命令格式如下:
# Linux 环境 sed -i 's/\(Dog:[0-9.]\+\)/\1#Del/g' 目标文件.nwk # MacOS 环境(BSD sed 需要给-i参数指定空备份后缀) sed -i '' 's/\(Dog:[0-9.]\+\)/\1#Del/g' 目标文件.nwk
如果你的文件里物种名前可能存在空格(比如示例里 Dog:前的缩进空格),可以加空格匹配规则提升兼容性:
sed -i 's/\([[:space:]]*Dog:[0-9.]\+\)/\1#Del/g' 目标文件.nwk
2. 多物种批量加同一种标记
如果要同时给多个物种加相同标记,用正则或匹配多个物种名即可:
# 同时给Dog、Pig、Sheep三个物种加#Del标记,直接修改当前目录所有.nwk文件 sed -i 's/\([[:space:]]*\(Dog\|Pig\|Sheep\):[0-9.]\+\)/\1#Del/g' *.nwk
3. 封装为可复用脚本
如果需要频繁给不同物种加不同标记,可以封装为简单的bash脚本add_branch_tag.sh:
#!/bin/bash # 参数1:目标物种名,多个用|分隔 比如"Dog|Pig|Sheep" # 参数2:要加的标记 比如#Del # 后续参数:要处理的文件路径 species=$1 tag=$2 shift 2 sed -i "s/\([[:space:]]*\(${species}\):[0-9.]\+\)/\1${tag}/g" "$@"
使用示例:
chmod +x add_branch_tag.sh # 给所有nwk文件的Dog、Pig分支加#Del标记 ./add_branch_tag.sh "Dog|Pig" "#Del" *.nwk
内容的提问来源于stack exchange,提问作者ZenMac
相关产品推荐
相关产品推荐

