修改 sed 以便将唯一的文件部分分配给变量

Modify sed so as to assign unique fileparts into variable

我有一个包含多个不同文件名的文件夹,每个文件名都有一个共同的模式,如下所示:

样本A-1.txt

样本A-2.txt

样本A-3.txt

样本B-1.txt

样本B-2.txt

样本B-3.txt

我想使用 sed 以仅获取“-number.txt”部分之前的唯一文件名。换句话说,我想要以下结果:

样本A

样本B

样本 C

等等

而且我想在 for 循环内的变量(例如 SAMPLE)中分配以上内容。所以我有以下内容:

    for FILE in $HOME_PATH/*.txt
do
    SAMPLE=`basename $FILE | sed s/\.1.txt//`

这正是我想要的,但显然只有当我有 Sample*-1.txt 文件时,而不是 $HOME_PATH 中的 -2 或 -3s。本质上我想删除“-”之后的所有内容并将唯一名称分配给变量。你能建议修改我的 sed 吗?我确信这很容易做到,但我尝试了几种变体都没有成功,所以我在这里遗漏了一些明显的东西。

在此先感谢您的努力!

VAR="$( 
    for f in $HOME_PATH; do 
        basename $f | sed -n "s/\-[0-9]\+\.txt//p"; 
    done | sort | uniq )"
echo "$VAR"

这会像您之前的示例一样遍历所有文件,并截断 -1.txt 部分(除了 [0-9]\+ 匹配后面的任何数字)。

这只打印与模式匹配的文件名:-n 表示默认情况下不打印任何内容,而 sed 语句末尾的 /p 告诉它在打印时打印找到匹配项

此时,您有一个如下所示的列表:SampleA SampleA SampleA SampleB SampleB SampleB

然后将输出通过管道传输到 sort(以防它们乱序),然后传输到 uniq,这会删除任何重复的条目(注意 -- uniq需要排序的输入)。这给你输出

 SampleA 
 SampleB

然后分配给$VAR

不需要sed,仅使用parameter expansion:

for file in "$dir"/*.txt; do
    sample=${file##*/}
    sample=${sample%-*}
done