修改 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
我有一个包含多个不同文件名的文件夹,每个文件名都有一个共同的模式,如下所示:
样本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