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
但这仅适用于每一行的一次匹配。