如何使用 sed 将正则表达式的第一个模式附加到行尾?

如何使用 sed 将正则表达式的第一个模式附加到行尾?

我有一个 .fasta(文本)文件,其中包含以下格式的 DNA 序列数据:

>uce-8374_Genus_species
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG

>uce-239_Genus_species
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG

>uce-83_Genus_species
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA

>uce-902_Genus_species
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC

我正在尝试将所有内容附加到第一的下划线,前面有一个,|只有行尾有>。因此,例如,第一个序列将读取: uce-8374_Genus_species|uce-8374,后面是它下面的 DNA 序列。有没有办法在 sed 中做到这一点?我尝试将其存储^[^_]+(?=_)到变量中,但它不起作用,只是一直附加^[^_]+(?=_)到行尾而不是模式本身。任何帮助以及解释(因为我是正则表达式的新手)都会有所帮助。如果有更好的方法可以解决这个问题,我愿意接受其他选择!

到目前为止,我已经尝试过(我只会展示第一个 DNA 序列,但我想改变它们全部):

sed -E 's/species/species|^[^_]+(?=_)/' sample_file.fasta

结果:uce-8374_Genus_species|^[^_]+(?=_)

我也尝试过:

x="^[^_]+(?=_)"
sed -E "s/species/species|$x/" "sample_file.fasta"

结果:uce-8374_Genus_species|^[^_]+(?=_)

答案1

与 Perl 不同,sed 不支持 PCRE 前瞻语法,(?=_)但您可以按如下方式模拟它:

  • 匹配>固定在行首^>
  • 然后匹配并捕获零个或多个非_字符([^_]*)
  • 然后匹配其他所有内容.*

然后替换为

  • 整个匹配的模式&
  • 接下来是文字|,然后是第一个捕获的组\1

所以

$ sed -E 's/^>([^_]*).*/&|\1/' sample_file.fasta 
>uce-8374_Genus_species|uce-8374
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG

>uce-239_Genus_species|uce-239
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG

>uce-83_Genus_species|uce-83
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA

>uce-902_Genus_species|uce-902
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC

相关内容