Bash 去除两个字符串之间的所有点但保留其他地方的点

Bash 去除两个字符串之间的所有点但保留其他地方的点

问题描述

假设有以下文件:

touch test2

echo "refH.fasta = ref/GCA_013924565.1_ASM1392456v1_genomic.fasta" >> test2


echo "subjectGCA_017717955.1_PDT000990484.1_genomic_querry.fasta = GCA_017717955.1_PDT000990484.1_genomic.fasta" >> test2

echo "file=subjectGCA_017717955.1_PDT000990484.1_genomic_querry" >> test2

在上面的文件中,我想要删除仅在字符串’subject’和’_querry’之间的点,而不删除文件的其他部分。 因此,输出应该看起来像这样:

refH.fasta = ref/GCA_013924565.1_ASM1392456v1_genomic.fasta
subjectGCA_0177179551_PDT0009904841_genomic_querry.fasta = GCA_017717955.1_PDT000990484.1_genomic.fasta
file=subjectGCA_0177179551_PDT0009904841_genomic_querry

解决方案

这是用Ruby来完成的:

ruby -lpe '_=_.split(/(subject.*?_querry)/).
    map{|s| s=s[/subject.*?_querry/] ? s.gsub(/\./,"") : s}.join' test2

或者是Perl:

perl -lnE '@a=(); for x (split /(subject.*?_querry)/){x=~s/\.//g if x=~/subject.*?_querry/;    push @a,x } 
    say join("",@a)' test2

这可以完全使用 Bash 实现:

while IFS= read -r line || [[ -n line ]]; do    if [[line =~ (subject.*_querry) ]]; then 
        line={line/""{BASH_REMATCH[1]}""/""{BASH_REMATCH[1]//./}""}
    fi        printf "%s\n" "line"
done <test2

但这仅适用于每一行的一次匹配。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程