替换两个字符之间的模式

替换两个字符之间的模式
Staphylococcus_sp_HMSC14C01-KV792037.1:0.00371647154267842634,Staphylococcus_hominis_VCU122-AHLD01000058.1:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01-KV814990.1:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE-JUSR01000051.1:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE-JVVL01000037.1:0.00594050248317441135)

逗号分隔不同的项目,在每个项目中,我想删除 之间的所有内容(包括)-,但保留.:-:

我怎样才能做到这一点?所以它应该看起来像:

Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856

我使用过sed 's/-.*://' 1.file > 2.file,但最终删除了整个文件,只保留了第一个和最后一个值。

答案1

.*是一个贪婪的正则表达式,匹配最长可能的匹配。您需要匹配最短的匹配,但在整行上全局匹配它。尝试

sed 's/-[^:-]*:/:/g' 1.file > 2.file

字符类[^:-]匹配任何内容除了冒号和破折号(也许它应该只匹配除冒号之外的任何内容),因此正则表达式表示“破折号后跟任意数量的非破折号、非冒号字符,后跟冒号”。然后它用冒号替换它(因为你想保留它)并g在行上进行全局替换(尾随)。如果省略g,则仅替换第一个实例。

答案2

awk解决方案:

awk -F',' '{ for(i=1;i<=NF;i++) sub(/-[^:-]+/,"",$i) }1' OFS=',' 1.file

  • -F','- 字段分隔符

  • for(i=1;i<=NF;i++)- 遍历记录的所有字段

  • sub(/-[^:-]+/,"",$i- 替换所需的序列(之间-包括-但保留


输出:

Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE:0.00594050248317441135)

相关内容