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

时间:2018-09-11 19:22:15

标签: regex bash filenames

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

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

位置:

  1. <artifactName>中可以包含破折号
  2. <version>的格式必须为XX.YX.X.YX.X.X.Y,其中X是任意数字,Y是字母数字可以包含下划线的字符串
  3. <classifier>必须为以下格式之一:
    一种。 <datestring>b<buildNumber>_<branch>
    b。 <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中使用的正则表达式。

1 个答案:

答案 0 :(得分:0)

使用shell parameter expansion:这有点冗长,但可靠。

<label> 
            <input name="POJO boolean property" id="POJO boolean property" value="${POJO boolean property}" class="toggle-switch" type="checkbox"> 
             <span aria-hidden="true" class="toggle-switch-bar"> 
                <span class="toggle-switch-handle"> 
                  <span aria-hidden="true" class="icon-ok toggle-switch-icon toggle-switch-icon-on">
                  </span>
                <span aria-hidden="true" class="icon-remove toggle-switch-icon toggle-switch-icon-off">
                </span>
             </span></span> 
        </input>
    </label>
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 "%s\n" "$artifact" "$version" "$classification" "$extension"

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