使用 bash 正则表达式从文件名中提取信息



我需要一个正则表达式来匹配和提取具有以下格式的文件名的组:

<artifactName>-<version>-<classifier>.<extension>

哪里:

  1. <artifactName>可以有破折号
  2. <version>的格式必须为XX.YX.X.YX.X.X.Y,其中 X 是任意位数的数字,Y 是可以包含下划线的字母数字字符串
  3. <classifier>必须是以下格式之一:
    a.<datestring>b<buildNumber>_<branch>
    ·
    <branch>其中<datestring>是 14 位数字,<buildNumber>是任意位数,<branch>是可以包含短划线或句点的任何字母数字字符串
  4. <extension>可以是任何可以包含下划线的字母数字字符串

到目前为止,我有这个正则表达式,它适用于在线正则表达式测试器,但在 bash 脚本中测试时失败:

^(.+)-((?:[[:digit:]]+.){0,3}(?:[[:digit:]]+))-((?:([0-9]{14})b([[:digit:]]+)_([^.]*))|(?:[^.]*)).(.+)$

我使用的脚本如下所示:

FILE_NAME='some-artifact-1.2.3.4-20180911123456b123_branch.ex.ten.sion'
REGEX='^(.+)-((?:[[:digit:]]+.){0,3}(?:[[:digit:]]+))-((?:([0-9]{14})b([[:digit:]]+)_([^.]*))|(?:[^.]*)).(.+)$'
if [[ "${FILE_NAME}" =~ ${REGEX} ]]
then
echo "Artifact     = ${BASH_REMATCH[1]}"
echo "Version      = ${BASH_REMATCH[2]}"
echo "Classifier   = ${BASH_REMATCH[3]}"
echo "Build Date   = ${BASH_REMATCH[4]}"
echo "Build Number = ${BASH_REMATCH[5]}"
echo "Branch       = ${BASH_REMATCH[6]}"
echo "Extension    = ${BASH_REMATCH[7]}"
fi

我假设 bash 使用的解释器需要稍微不同的语法,但我无法弄清楚如何将在线测试器中工作的正则表达式转换为在 bash 中工作的正则表达式。

使用 shell 参数扩展:它有点冗长,但可靠。

FILE_NAME='some-artifact-1.2.3.4-20180911123456b123_branch.ex.ten.sion'
art_ver=${FILE_NAME%-*}
artifact=${art_ver%-*}
version=${art_ver##*-}
class_ext=${FILE_NAME##*-}
classification=${class_ext%%.*}
extension=${class_ext#*.}
printf "%sn" "$artifact" "$version" "$classification" "$extension"
some-artifact
1.2.3.4
20180911123456b123_branch
ex.ten.sion

我只是更仔细地阅读了您的要求:如果分支可以包含点并且扩展可以包含点,则无法确定分支停止和扩展开始的位置。

最新更新