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

时间:2014-06-20 02:06:57

标签: regex bash semantic-versioning

我有以下内容:

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

versionShort=${versionNumber:0:4}  # Cut string to 1 decimal place for calculation

在版本如下时起作用:

10.9.2
10.9.5

但不匹配

10.10.3

因为它只会返回

10.1

但我想将versionShort设置为

10.10

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

4 个答案:

答案 0 :(得分:12)

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

versionShort=${versionNumber%.*}

答案 1 :(得分:9)

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

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

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

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

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

product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
versionShort="${semver[0]}.${semver[1]}"

答案 2 :(得分:6)

Regexp解决方案:

[[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]] && echo "${BASH_REMATCH[0]}"

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

10.5
10.5.9
10.5.8.2

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

这是一个更长的版本:

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

答案 3 :(得分:0)

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
}