regex - 使用 bash 正则表达式从文件名中提取信息
问题描述
我需要一个正则表达式来匹配和提取具有以下格式的文件名的组:
<artifactName>-<version>-<classifier>.<extension>
在哪里:
<artifactName>
里面可以有破折号<version>
必须是 , , , 或 格式X
,X.Y
其中X.X.Y
XX.X.X.Y
是任意位数,Y 是可以包含下划线的字母数字字符串<classifier>
必须是以下格式之一
:<datestring>b<buildNumber>_<branch>
湾。<branch>
其中<datestring>
是 14 位数字,<buildNumber>
是任意位数,并且<branch>
是可以包含短划线或句点的任何字母数字字符串<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 "%s\n" "$artifact" "$version" "$classification" "$extension"
some-artifact
1.2.3.4
20180911123456b123_branch
ex.ten.sion
我只是更仔细地阅读了您的要求:如果分支可以包含点并且扩展可以包含点,则无法确定分支停止和扩展开始的位置。
推荐阅读
- excel - 需要运行时错误“424”对象 - 不确定我在这段代码中写错了什么?
- python - 是否可以在深度神经网络中进行实时训练和测试?
- html - chart.js 图表大小与容器设置大小不同
- python - elif 条件不适用于 python 中的字符串匹配
- python - 如何在 jupyter notebook 中运行 parse_args()?收到错误 SystemExit: 2
- c++ - IncludeOS hello world 失败
- python - 在列块中展平或分组数组 - NumPy / Python
- php - Laravel 5.8 - 如何在循环内更新表
- docker - 无法在詹金斯管道中以更高分辨率保存柏树屏幕截图
- php - 与数据库的连接在本地主机上工作,但不在线