如何用Bash正则表达式匹配.fa/.fasta/.fasta.gz文件扩展名?
问题分析与解决方法
你的问题核心是正则表达式未覆盖.fa后缀的匹配规则。假设你Attempt 8的正则类似\.fasta(\.gz)?$,它仅能匹配以.fasta或.fasta.gz结尾的文件,完全遗漏了.fa的情况。
正确的Bash正则写法
以下两种写法都能同时匹配三种目标后缀:
方式一:直接枚举所有后缀
if [[ "$filename" =~ \.(fa|fasta|fasta\.gz)$ ]]; then echo "符合预期类型" else echo "不符合预期类型" fi
正则\.(fa|fasta|fasta\.gz)$的逻辑:以.开头,后续紧跟fa、fasta或fasta.gz,且匹配至字符串末尾,避免误匹配类似file.fa.bak的文件。
方式二:利用后缀共性简化正则
因为.fa是.fasta的缩写,可以优化正则结构:
if [[ "$filename" =~ \.fa(sta(\.gz)?)?$ ]]; then echo "符合预期类型" else echo "不符合预期类型" fi
逻辑拆解:
\.fa匹配基础后缀开头(sta)?表示sta可选,对应.fa或.fasta两种情况(\.gz)?表示.gz可选,对应是否为压缩文件$确保匹配到文件名字符串的结尾
测试验证
用以下文件名测试均符合预期:
test.fa→ 匹配成功test.fasta→ 匹配成功test.fasta.gz→ 匹配成功test.fa.gz→ 匹配失败(符合需求,因为目标仅包含.fasta.gz)test.fasta.bak→ 匹配失败(避免误匹配非目标文件)
内容的提问来源于stack exchange,提问作者G_T
相关产品推荐
相关产品推荐

