如何从 bash 中的字符串获取版本号

How to get version number from string in bash

我有一个具有以下格式的变量
bundle="chn-pro-X.Y-Z.el8.x86_64"

X,Y,Z 是任意位数的数字
例如:

1.0-2  # X=1 Y=0 Z=2
12.45-9874 # X=12 Y=45 Z=9874

如何获取 X.Y 并将其存储在另一个变量中?

编辑:

我的措辞不对,但是 我想将 X.Y 存储到新变量中,而不是单独的 X & Y's 我希望最终有一个变量 version,它从 bundle:
中获取了 X.Y version="X.Y"

像这样:

$ bundle="chn-pro-1.0-2.el8.x86_64"
$ X="$(echo "$bundle" | cut -d . -f1 | cut -d- -f3)"
$ Y="$(echo "$bundle" | cut -d . -f2 | cut -d- -f1)"
$ Z="$(echo "$bundle" | cut -d . -f2 | cut -d- -f2)"
$ echo "$X"
1
$ echo "$Y"
0
$ echo "$Z"
2

您可以将 XY 合并为一个变量:

$ XY="$X.$Y"
$ echo $XY
1.0

我会使用 awk:

bundle="chn-pro-12.45-9874.el8.x86_64"
echo "$bundle" | awk -F "[.-]" '{print ,,}'
12 45 9874

现在,如果您想分配给 x, y, z,请使用 read 并处理替换:

read -r x y z < <(echo "$bundle" | awk -F "[.-]" '{print ,,}')

echo "x=$x, y=$y, z=$z"
x=12, y=45, z=9874

如果您只想将 X.Y 的值作为单个值,这对 awk 来说仍然很有用:

bundle="chn-pro-12.45-9874.el8.x86_64"
echo "$bundle" | awk -F "[-]" '{print }'
12.45

如果您想将其放入变量中:

x_y=$(echo "$bundle" | awk -F "[-]" '{print }')
echo "x_y=$x_y"
x_y=12.45

或者你可以在这种情况下使用cut来获取第三个字段:

echo "$bundle" | cut -d- -f3
12.45

使用正则表达式分隔数字:

numbers=$(echo $bundle | grep -Eo '([0-9]+\.[0-9]+\-[0-9]+)' | sed 's/\./\t/g;s/\-/\t/g')

然后使用 awk 或 tr 或 cut 将它们分配给变量,无论你想要什么:

X=$(echo $numbers| awk '{print }')
Y=$(echo $numbers| awk '{print }')
Z=$(echo $numbers| awk '{print }')

编辑

为了将 x.y 存储到单个版本变量中,您可以简单地忽略 pervios 命令:

version=$(echo $bundle | grep -Eo '([0-9]+\.[0-9]+\-[0-9]+)' | grep -Eo '([0-9]+\.[0-9]+)')

鉴于此输入:

$ bundle="chn-pro-12.45-9874.el8.x86_64"

使用 GNU 或 BSD sed -E:

$ foo=$(echo "$bundle" | sed -E 's/.*-([0-9]+\.[0-9]+)-[0-9].*//')
$ echo "$foo"
12.45

或任何 sed:

$ foo=$(echo "$bundle" | sed 's/.*-\([0-9][0-9]*\.[0-9][0-9]*\)-[0-9].*//')
$ echo "$foo"
12.45

假设:

  • 输入字符串将始终包含(至少)3 个连字符
  • 所需的 version 字符串将始终位于输入字符串的第二个和第三个连字符之间
  • 我们需要维护输入字符串(即,不要 clobber/overwrite 包含输入字符串的变量)

我们可以通过使用一些 parameter expansions:

来消除子进程调用(echo/sed/grep/awk/sed 所必需的)
$ bundle="chn-pro-X.Y-Z.el8.x86_64"

$ temp="${bundle#*-}"                   # strip off 1st hyphen delimited string
$ echo "${temp}"
pro-X.Y-Z.el8.x86_64

$ temp="${temp#*-}"                     # strip off 2nd hyphen delimited string
$ echo "${temp}"
X.Y-Z.el8.x86_64

$ version="${temp%%-*}"                 # save 3rd hyphen delimited string (aka our version)
$ echo "${version}"
X.Y

注意: 我们可以通过将所有出现的 temp 替换为 version 来消除 temp 变量,并理解 version 在第三个参数扩展发生之前不包含我们想要的内容,例如:

$ bundle="chn-pro-X.Y-Z.el8.x86_64"
$ version="${bundle#*-}"
$ version="${version#*-}"
$ version="${version%%-*}"
$ echo "${version}"
X.Y