如何从文件名中提取段?

时间:2018-07-06 14:11:57

标签: bash shell

我有一个具有以下命名方案的文件目录:

<project name>-<group name>.txt

我想从循环浏览的文件中提取<group name>

#!/bin/sh

for f in *; do
    echo "group name: ${f}"
done

这怎么办?我正在尝试${f##...}${f%...},但到目前为止没有成功。我不确定是否可以将它们组合在一起,所以我可以先省略前缀<project name>-,然后再省略后缀.txt

2 个答案:

答案 0 :(得分:0)

我不知道是否可以在一行中完成,但是如果分步骤进行,那很容易:

for f in *.txt; do
    base=${f%.txt}
    projectname=${base%-*}
    groupname=${base#*-}
    echo project name: $projectname
    echo group name: $groupname
done

如果您可以调用外部程序,那么它也可以工作并且可读性强。

for f in *.txt; do
    groupname=$(basename ${f#*-} .txt)
    echo group name: $groupname
done

答案 1 :(得分:0)

for file in *-*.txt; do
    # shortest match: a-b-c-d.txt => d
    [[ $file =~ ([^-]+).txt$ ]] && echo "${BASH_REMATCH[1]}"
    # longest match: a-b-c-d.txt => b-c-d
    [[ $file =~ -(.+).txt$ ]] && echo "${BASH_REMATCH[1]}"
done