如何从字符串中提取第一个下划线之前的所有内容?

3

我有一些文件,它们的命名方式如下:

MG-AB-110_S101_R2_001.fastq.gz, MG-AB-109_S100_R1_001.fastq.gz...

我正在尝试提取第一个下划线之前的所有内容,以便获得:MG-AB-110、MG-AB-109等...

我尝试了以下方法:

name="MG-AB-110_S101_R2_001.fastq.gz"
base_name=${name%%.*}
echo $base_name
MG-AB-110_S101_R2_001

并且还有这个:

base_name=${name%%(.*?)_.* }
echo $base_name
MG-AB-110_S101_R2_001.fastq.gz

我需要这些基础名称与另一个文件夹中的基础名称匹配,所以上面的正则表达式将成为此循环的一部分:
#!/bin/bash

for name in test1/*.gz; do
    base_name=${name%%.*}

    if [ -f "test2/$base_name" ]; then
        cat "$name" "test2/$base_name" >"all_combined/$base_name"
    else
         printf 'No file in test2 corresponds to "%s"\n' "$name" >&2
    fi
done

使用正则表达式:[[ $name =~ ([^_]*) ]] && echo "${BASH_REMATCH[1]}" - Cyrus
我删除了那个更新,并在这里发布了一个新问题:https://stackoverflow.com/questions/67994464/how-to-match-files-in-different-folders-by-partial-file-name-and-concatenate-the - newbash
1个回答

6

使用bash及其参数扩展功能:

name="MG-AB-110_S101_R2_001.fastq.gz"
echo "${name%%_*}"

输出:

MG-AB-110

那个页面是一个解析圣经。收藏起来吧。 - Paul Hodges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接