如何仅移除文件中'subject'与'_querry'之间的所有点号
需求与解决方案
场景
先通过以下命令生成test2文件:
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
解决方案
方法1:使用awk
awk '{ while (match($0, /subject.*_querry/)) { target = substr($0, RSTART, RLENGTH) gsub(/\./, "", target) $0 = substr($0, 1, RSTART-1) target substr($0, RSTART+RLENGTH) } print }' test2
逻辑:循环匹配每行中subject到_querry的片段,提取后清空其中的点号,再把处理后的片段替换回原行,最后输出修改后的内容。
方法2:使用Perl一行命令
perl -pe 's/(subject)(.*?)(_querry)/$1 . $2 =~ s|\.||gr . $3/ge' test2
逻辑:用正则捕获三个部分——subject、中间内容、_querry,对中间部分执行点号删除操作,再拼接三部分输出。/ge修饰符允许在替换时嵌入代码逻辑,s|\.||gr返回去除点号后的字符串。
内容的提问来源于stack exchange,提问作者Panos
相关产品推荐
相关产品推荐

