【问题标题】:Extract information from a file name using a bash regular expression使用 bash 正则表达式从文件名中提取信息
【发布时间】:2018-09-11 19:22:14
【问题描述】:

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

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

地点:

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

到目前为止,我有这个正则表达式,它适用于在线正则表达式测试器,但在 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 中的正则表达式。

【问题讨论】:

  • bash 使用 POSIX 正则表达式,而不是 Perl 兼容的正则表达式,因此没有 (?:...) 非捕获组。
  • (即POSIX扩展正则表达式,详情咨询man re_format
  • 你可以试试pcregrep
  • @chepner 就是这样!谢谢。

标签: regex bash filenames


【解决方案1】:

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

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"
some-artifact
1.2.3.4
20180911123456b123_branch
ex.ten.sion

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

【讨论】:

    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多