我目前正在尝试使用bash从文件名中提取子字符串和版本号。
文件名有两种格式:
对于第一个场景,我能够使用sed提取版本号,像这样:
然而,这对于第二种情况是行不通的。
最终,我希望创建一个脚本,将第一个子字符串和版本存储在一个类似下面的关联数组中。
这证明是棘手的,因为我似乎找不到适用于两种情况的好方法。而对于包含分支名称的情况,我事先无法知道分支名称将包含多少个单词。
我认为变量扩展可能是解决的方法,但是我无法得到我想要的输出。
文件名有两种格式:
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"
这证明是棘手的,因为我似乎找不到适用于两种情况的好方法。而对于包含分支名称的情况,我事先无法知道分支名称将包含多少个单词。
我认为变量扩展可能是解决的方法,但是我无法得到我想要的输出。
([0-9.]*)
来匹配数字,而不是使用(.*)
。这样你就不需要担心它后面的内容了。 - undefinedsed -r
来使用扩展正则表达式,而无需太多转义。 - undefined*.tar.gz
代替*.tgz
吗? - undefinedexample-substring-1.1.0-branch-1.2.3.tgz
,因此您应该在示例输入/输出中包含至少一个这样的字符串,因为在潜在的解决方案中,这可能是一个容易出错的匹配。您还应该考虑其他可能出现的特殊情况。 - undefinedexample-substring
也可能包含-<数字>
,那么你也需要包含那种情况的示例,并解释如何区分它与实际的版本号。 - undefined