我有一个文件,它的名字看起来像:

12U12345._L001_R1_001.fastq.gz

我想仅将 12U12345 部分分配给变量。

到目前为止,我有:
variable=`basename $fastq | sed {s'/_S[0-9]*_L001_R1_001.fastq.gz//'}`

注意:$fastq 是一个变量,其中包含文件的完整路径。

此解决方案当前返回完整的文件名,任何想法如何正确地做到这一点?

最佳答案

只需使用shell提供的内置参数扩展,而不是产生一个单独的进程

fastq="12U12345._L001_R1_001.fastq.gz"
printf '%s\n' "${fastq%%.*}"
12U12345

或使用 printf() 本身一次性存储到新变量
printf -v numericPart '%s' "${fastq%%.*}"
printf '%s\n' "${numericPart}"

此外 bash 有一个内置的正则表达式比较运算符,由 =~ 表示,您可以使用它
fastq="12U12345._L001_R1_001.fastq.gz"
regex='^([[:alnum:]]+)\.(.*)'

if [[ $fastq =~ $regex ]]; then
    numericPart="${BASH_REMATCH[1]}"
    printf '%s\n' "${numericPart}"
fi

关于bash - 将文件名的一部分分配给 bash 变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49453857/

10-11 16:45