我有一个文件夹,其中包含几个不同的文件名,每个文件名都具有以下通用模式:
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进行修改吗?我确信这很容易做到,但是我尝试了几种变体却没有成功,所以我在这里遗漏了一些明显的东西。
预先感谢您的努力!
答案 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