bash正则表达式匹配语义版本号

luk*_*emh 10 regex bash semantic-versioning

我有以下内容:

versionNumber=$(sw_vers -productVersion) # Finds version number

versionShort=${versionNumber:0:4}  # Cut string to 1 decimal place for calculation
Run Code Online (Sandbox Code Playgroud)

这个版本是这样的:

10.9.2
10.9.5
Run Code Online (Sandbox Code Playgroud)

但它不会匹配

10.10.3
Run Code Online (Sandbox Code Playgroud)

因为它只会返回

10.1
Run Code Online (Sandbox Code Playgroud)

但我希望将versionShort设置为

10.10
Run Code Online (Sandbox Code Playgroud)

我想要匹配上面的主要版本,第一个点和次要版本.

Ama*_*dan 12

Regexpless解决方案 - 切断最后一个点及其后的任何内容:

versionShort=${versionNumber%.*}
Run Code Online (Sandbox Code Playgroud)


n8f*_*ton 9

我有一个类似的问题,但我需要访问所有3个细分.我做了一些研究和测试,我发现这很好用

product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
major="${semver[0]}"
minor="${semver[1]}"
patch="${semver[2]}"
echo "${major}.${minor}.${patch}"
Run Code Online (Sandbox Code Playgroud)

要直接回答这个问题,你可以

product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
major="${semver[0]}"
minor="${semver[1]}"
patch="${semver[2]}"
versionShort="${major}.${minor}"
Run Code Online (Sandbox Code Playgroud)

或者你可以使用更少的变量

product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
versionShort="${semver[0]}.${semver[1]}"
Run Code Online (Sandbox Code Playgroud)

  • @JasonHarrison 代码通过替换点“。” 用空格“”,然后将所有参数作为一个 bash 数组。为了使其工作,您需要先将 semver 文本分配给一个变量。例如,`a="10.11.6"; semver=( ${a//./ } )` (2认同)

Ale*_*-A. 7

正则表达式解决方案:

[[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]] && echo "${BASH_REMATCH[0]}"
Run Code Online (Sandbox Code Playgroud)

它将始终打印前两个数字,例如所有这些:

10.5
10.5.9
10.5.8.2
Run Code Online (Sandbox Code Playgroud)

将导致10.5输出。您还可以添加一个else子句以检查是否发生了某些错误(找不到匹配项)。

这是更长的版本:

if [[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]]; then
    versionShort=${BASH_REMATCH[0]}
else
    echo "Something is wrong with your version" >&2
fi
Run Code Online (Sandbox Code Playgroud)


rhi*_*.xn 6

https://github.com/fsaintjacques/semver-tool https://github.com/fsaintjacques/semver-tool/blob/master/src/semver

SEMVER_REGEX="^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(\\-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$"


function validate-version {
  local version=$1
  if [[ "$version" =~ $SEMVER_REGEX ]]; then
    # if a second argument is passed, store the result in var named by $2
    if [ "$#" -eq "2" ]; then
      local major=${BASH_REMATCH[1]}
      local minor=${BASH_REMATCH[2]}
      local patch=${BASH_REMATCH[3]}
      local prere=${BASH_REMATCH[4]}
      local build=${BASH_REMATCH[5]}
      eval "$2=(\"$major\" \"$minor\" \"$patch\" \"$prere\" \"$build\")"
    else
      echo "$version"
    fi
  else
    error "version $version does not match the semver scheme 'X.Y.Z(-PRERELEASE)(+BUILD)'. See help for more information."
  fi
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:此代码片段包含根据 GNU GPL v3 许可的代码:https://github.com/fsaintjacques/semver-tool/blob/master/LICENSE (2认同)