如何用sed/awk/tr替换A.nwk中CleanAgrobacterium与_gene间字符串为ZZZ
替换NWK文件指定区间字符串的解决方案
需求
将文件A.nwk中所有位于CleanAgrobacterium和_gene之间的字符串替换为ZZZ。
原文件A.nwk内容:
(((CleanAgrobacterium_fabrum_str__C58_DE0068_Scaffold_Proteins_gene-FS783_RS12830:0,CleanAgrobacterium_fabrum_str__C58_DE0067_Scaffold_Proteins_gene-FS653_RS12825:0):0.056789,(CleanAgrobacterium_fabrum_GV2260_Complete_Genome_Proteins_gene-EML4058_RS17445:0,(CleanAgrobacterium_fabrum_1D1416_Chromosome_Proteins_gene-NQG32_RS17500:0,(CleanAgrobacterium_fabrum_PDC82_Contig_Proteins_gene-BLT49_RS14090:0,(CleanAgrobacterium_fabrum_N3394_Scaffold_Proteins_gene-G6L76_RS17395:0,(CleanAgrobacterium_fabrum_12D13_Complete_Genome_Proteins_gene-At12D13_RS18010:0,(CleanAgrobacterium_fabrum_Bi46_Contig_Proteins_gene-LQ162_RS02700:0,(CleanAgrobacterium_fabrum_ARqua1_Scaffold_Proteins_gene-HI842_RS18310:0,(CleanAgrobacterium_fabrum_N4094_Scaffold_Proteins_gene-G6L42_RS17400:0,(CleanAgrobacterium_fabrum_GV3101__pMP90_Complete_Genome_Proteins_gene-EML485_RS17435:0,(CleanAgrobacterium_fabrum_Kin001_Complete_Genome_Proteins_gene-FY134_RS17775:0,(CleanAgrobacterium_fabrum_LBA645_Complete_Genome_Proteins_gene-KXJ62_RS17445:0,(CleanAgrobacterium_fabrum_Di1525a_Scaffold_Proteins_gene-G6L89_RS17735:0,(CleanAgrobacterium_fabrum_NFIX02_Scaffold_Proteins_gene-BLR22_RS16795:0,(CleanAgrobacterium_fabrum_Arqua_Contig_Proteins_gene-EXN51_RS19140:0,(CleanAgrobacterium_fabrum_str__J-07_J-07_Scaffold_Proteins_gene-AGR8A_RS20015:0,CleanAgrobacterium_fabrum_1D132_Complete_Genome_Proteins_gene-At1D132_RS18580:0):0):0):0):0):0):0):0):0):0):0):0):0):0):0):0):0,(CleanAgrobacterium_fabrum_EHA105_Complete_Genome_Proteins_gene-EML540_RS17455:0,(CleanAgrobacterium_fabrum_RIT-As-3_Contig_Proteins_gene-ORG40_RS11815:0,(CleanAgrobacterium_fabrum_2788_Contig_Proteins_gene-G6L39_RS17590:0,(CleanAgrobacterium_fabrum_BG5_Complete_Genome_Proteins_gene-F3P66_RS17495:0,(CleanAgrobacterium_fabrum_Bi05_Contig_Proteins_gene-LQV40_RS07170:0,(CleanAgrobacterium_fabrum_str__C58_C58_Complete_Genome_Proteins_gene-ATU_RS17440:0,CleanAgrobacterium_fabrum_NFIX01_Scaffold_Proteins_gene-BMY00_RS16800:0):0):0):0):0):0):0);
错误命令分析
你之前使用的命令:
sed "/CleanAgrobacterium/,/gene-/d" A.nwk
该命令的作用是删除从匹配CleanAgrobacterium的行到匹配gene-的行,并非替换指定区间的字符串,因此无法实现需求。
正确解决方案
方法1:使用sed命令
利用sed的正则替换功能,通过捕获组定位需要替换的区间:
sed 's/CleanAgrobacterium\(.*\)_gene/CleanAgrobacteriumZZZ_gene/g' A.nwk
s/原模式/替换模式/g:全局替换所有匹配的内容CleanAgrobacterium\(.*\)_gene:匹配以CleanAgrobacterium开头、_gene结尾的片段,\(.*\)捕获两者之间的任意内容- 替换为
CleanAgrobacteriumZZZ_gene,直接将捕获的中间内容替换为ZZZ
方法2:使用awk命令
通过awk的gsub函数实现全局替换:
awk '{gsub(/CleanAgrobacterium.*?_gene/, "CleanAgrobacteriumZZZ_gene")}1' A.nwk
gsub:awk中的全局替换函数.*?:非贪婪匹配,确保每个CleanAgrobacterium只匹配到最近的_gene(避免跨多个匹配项)1:用于输出处理后的每一行
替换后效果示例
处理后的文件片段如下:
(((CleanAgrobacteriumZZZ_gene-FS783_RS12830:0,CleanAgrobacteriumZZZ_gene-FS653_RS12825:0):0.056789,(CleanAgrobacteriumZZZ_gene-EML4058_RS17445:0,...
内容的提问来源于stack exchange,提问作者Slimane khayi
相关产品推荐
相关产品推荐

