是否将文件名的一部分分配给bash变量?

是否将文件名的一部分分配给bash变量?,bash,shell,Bash,Shell,我有一个文件,其名称如下: 12U12345._L001_R1_001.fastq.gz 我只想将12U12345部分分配给变量 到目前为止,我已经: variable=`basename $fastq | sed {s'/_S[0-9]*_L001_R1_001.fastq.gz//'}` 注意:$fastq是一个变量,其中包含文件的完整路径 此解决方案当前返回完整的文件名,有没有正确的方法?您可以使用cut: $> fastq="/path/to/12U12345._L001_R1

我有一个文件,其名称如下:

12U12345._L001_R1_001.fastq.gz
我只想将
12U12345
部分分配给变量

到目前为止,我已经:

variable=`basename $fastq | sed {s'/_S[0-9]*_L001_R1_001.fastq.gz//'}`
注意:
$fastq
是一个变量,其中包含文件的完整路径


此解决方案当前返回完整的文件名,有没有正确的方法?

您可以使用
cut

$> fastq="/path/to/12U12345._L001_R1_001.fastq.gz"
$> variable=$(basename "$fastq" | cut -d '.' -f 1)
$> echo "$variable"
12U12345
此外,请注意:

  • 最好将变量用引号括起来。否则,您的命令将无法处理包含空格的文件名

  • 您应该使用
    $()
    而不是反勾号


只需使用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
使用提取basename,然后提取所需文件名的部分:

fastq="/path/to/12U12345._L001_R1_001.fastq.gz"
file="${fastq##*/}"  # gives 12U12345._L001_R1_001.fastq.gz
string="${file%%.*}" # gives 12U12345
请注意,Bash不允许嵌套参数扩展。否则,我们可以组合上面的语句2和3。

可以使用
cut
,但是执行命令替换或使用任何外部工具--
basename
也包括在内--会造成巨大的(多个数量级)性能损失,而不是bash的。当然,Bash解释器的速度很慢,但它作为启动时间杀手的名声更多地与人们编写涉及不必要的新进程的代码有关,而不是与固有的性能有关。