将部分文件名分配给bash变量?

时间:2018-03-23 16:01:58

标签: bash shell

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

12U12345._L001_R1_001.fastq.gz

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

到目前为止,我有:

variable=`basename $fastq | sed {s'/_S[0-9]*_L001_R1_001.fastq.gz//'}`

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

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

3 个答案:

答案 0 :(得分:5)

只需使用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

答案 1 :(得分:2)

您可以使用cut

$> fastq="/path/to/12U12345._L001_R1_001.fastq.gz"
$> variable=$(basename "$fastq" | cut -d '.' -f 1)
$> echo "$variable"
12U12345

另外,请注意:

  • 最好将变量包装在引号内。否则,您的命令将无法使用包含空格的文件名。

  • 您应该使用$()代替反对。

答案 2 :(得分:2)

使用Bash Parameter Expansion提取基本名称,然后提取所需文件名的部分:

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结合起来。