shell 从Linux中的.nupkg文件解析nuget包名称和版本

8cdiaqws  于 2023-04-21  发布在  Shell
关注(0)|答案(1)|浏览(80)

我试图在Linux shell中解析一个.nupkg文件名,如“foo.12.1.2.nupkg”。我试图捕获组并将包名存储在变量package_name中,并将版本存储在变量version中。在此示例中,package_name应该是“foo”,version应该是“12.1.2”。我使用的是this answer中引用的正则表达式^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$
代码如下:

string="foo.12.4.1.nupkg"
regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$'

if [[ $string =~ $regex ]]; then
  package_name=${BASH_REMATCH[1]}
  package_version=${BASH_REMATCH[2]}
  echo "Package name: $package_name"
  echo "Package version: $package_version"
else
  echo "String does not match regex"
fi

但是,这始终打印String does not match regex
我甚至尝试将其分解为以下组合:

> regex=^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$
> string=foo.12.4.1.nupkg
> [[ $string =~ $regex ]] && echo "matched" || echo "not matched"

> regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$'
> string='foo.12.4.1.nupkg'
> [[ $string =~ $regex ]] && echo "matched" || echo "not matched"

> regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$'
> string=foo.12.4.1.nupkg
> [[ $string =~ $regex ]] && echo "matched" || echo "not matched"

> regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$'
> string=foo.12.4.1.nupkg
> [[ ${string} =~ ${regex} ]] && echo "matched" || echo "not matched"

我总是得到“不匹配”的输出。我不知道我做错了什么。我到处找,仍然找不到解决方案。

p5fdfcr1

p5fdfcr11#

你可以用

regex='^(.*)\.(([0-9]+(\.[0-9]+){2,})[-a-z]*)\.nupkg$'

参见online demo

#!/bin/bash
regex='^(.*)\.(([0-9]+(\.[0-9]+){2,})[-a-z]*)\.nupkg$'
string=foo.12.4.1.nupkg
[[ $string =~ $regex ]] && echo "matched" || echo "not matched"

输出:true

  • 注意事项 *:
  • 如果不需要,所有捕获组都会被删除((?:[-a-z]+)? =〉[-a-z]*),或者转换为捕获(因为POSIX正则表达式不支持前者)。
  • 由于不支持惰性量词,.*?被替换为.*(在当前的正则表达式中,它看起来是合理的,因为你只需要在最后3个或更多的点分隔数字处停止)。

相关问题