如何从 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
您可以将 X
和 Y
合并为一个变量:
$ 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
我有一个具有以下格式的变量
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
您可以将 X
和 Y
合并为一个变量:
$ 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