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

时间:2018-06-26 15:27:45

标签: bash variables filenames

我有一个文件夹,其中包含几个不同的文件名,每个文件名都具有以下通用模式:

SampleA-1.txt

SampleA-2.txt

SampleA-3.txt

SampleB-1.txt

SampleB-2.txt

SampleB-3.txt

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

样品A

样品B

SampleC

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

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

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

预先感谢您的努力!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

无需sed,仅使用parameter expansion

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