gpt4 book ai didi

识别 Bash 脚本中文件扩展名的正则表达式模式对于捕获压缩文件不准确

转载 作者:行者123 更新时间:2023-11-29 09:22:32 27 4
gpt4 key购买 nike

我创建了这个带有一个参数(文件名)的 Bash 小脚本,该脚本应该根据文件的扩展名做出响应:

#!/bin/bash

fileFormat=${1}

if [[ ${fileFormat} =~ [Ff][Aa]?[Ss]?[Tt]?[Qq]\.?[[:alnum:]]+$ ]]; then
echo "its a FASTQ file";
elif [[ ${fileFormat} =~ [Ss][Aa][Mm] ]]; then
echo "its a SAM file";
else
echo "its not fasta nor sam";
fi

它是这样运行的:

sh script.sh filename.sam

如果它是一个 fastq(或 FASTQ,或 fq,或 FQ,或 fastq.gz(压缩)),我希望脚本告诉我“这是一个 fastq”。如果是 sam,我希望它告诉我它是 sam,如果不是,我想告诉我它既不是 sam 也不是 fastq。

问题:当我没有考虑 .gz(压缩)场景时,脚本运行良好并给出了我预期的结果,但是当我尝试添加最后一部分时发生了一些事情考虑到这种情况(见第三行,它说的部分 .?[[:alnum:]]+ )。这部分的意思是说“在文件名中,在扩展名(在本例中为 fastq)之后,可能会有一个点加上一些单词”。

我的输入是这样的:

sh script.sh filename.fastq.gz

而且它有效。但如果我把: sh 脚本.sh 文件名.fastq

它说这不是fastq。我想把最后一部分作为可选的,但是如果我添加一个“?”最后它不起作用。有什么想法吗?谢谢! 我的问题是修复该部分以适用于这两种情况。

最佳答案

你可以使用这个正则表达式:

fileFormat="$1"

if [[ $fileFormat =~ [Ff]([Aa][Ss][Tt])?[Qq](\.[[:alnum:]]+)?$ ]]; then
echo "its a FASTQ file"
elif [[ $fileFormat =~ [Ss][Aa][Mm]$ ]]; then
echo "its a SAM file"
else
echo "its not fasta nor sam"
fi

此处 (\.[[:alnum:]]+)? 使最后一组成为可选,即点后跟 1+ 个字母数字字符。

当你运行它时:

./script.sh filename.fastq
its a FASTQ file

./script.sh fq
its a FASTQ file

./script.sh filename.fastq.gz
its a FASTQ file

./script.sh filename.sam
its a SAM file

./script.sh filename.txt
its not fasta nor sam

关于识别 Bash 脚本中文件扩展名的正则表达式模式对于捕获压缩文件不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54094620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com