尝试使用 bash 从文件名中提取子字符串和版本号

问题描述 投票:0回答:1

我目前正在尝试使用 bash 从文件名中提取子字符串和版本号。

文件名有两种格式:

example-substring-1.1.0.tgz
example-substring-1.1.0-branch-name.tgz

对于第一个场景,我能够使用 sed 提取版本号,如下所示:

echo example-substring-1.1.0.tgz | sed "s/.*-\(.*\)\.[a-zA-Z0-9]\{3\}$/\1/"

但是这不适用于第二种情况。

最终我想创建一个脚本,将第一个子字符串和版本存储在关联数组中,如下所示。

example_array["example-substring"]="1.1.0"
example_array["example-substring"]="1.1.0-branch-name"

事实证明这很棘手,因为我似乎找不到适合这两种情况的好方法。对于版本包含分支名称的场景,我无法事先知道分支名称将包含多少个单词。

我认为变量扩展可能是可行的方法,但无法让它输出我想要的内容。

如有任何帮助,我们将不胜感激。

bash perl awk sed
1个回答
0
投票

如果您愿意使用

grep
而不是
sed
,那么前瞻和后瞻将允许您定义模式来提取您关心的内容。

考虑模式:

.+(?=-\d+\.\d+\.\d+)
这将匹配
-<numbers>.<numbers>.<numbers>
后面的任何内容。
?=
标记条件先行,它是必须匹配下一个字符的表达式,但被排除在模式的最终匹配之外。 与您的示例一起使用时:

$ echo example-substring-1.1.0.tgz | grep -Po '.+(?=-\d+\.\d+\.\d+)'
example-substring
$ echo example-substring-1.1.0-branch-name.tgz | grep -Po '.+(?=-\d+\.\d+\.\d+)'
example-substring

P
标志启用PCRE2,
o
标志仅打印匹配)

还要考虑模式:

(?<=-)\d+\.\d+\.\d+.*(?=\.tgz$)
它使用lookbehinds断言在该模式之前有一个
-
,并使用lookaheads断言该模式以
.tgz
结尾。 与您的示例一起使用时:

echo 'example-substring-1.1.0.tgz' | grep -Po '(?<=-)\d+\.\d+\.\d+.*(?=\.tgz$)'
1.1.0
$ echo 'example-substring-1.1.0-branch-name.tgz' | grep -Po '(?<=-)\d+\.\d+\.\d+.*(?=\.tgz$)'
1.1.0-branch-name
© www.soinside.com 2019 - 2024. All rights reserved.