How to get version number from string in bash

I have a variable having following format
bundle="chn-pro-X.Y-Z.el8.x86_64"

X,Y,Z are numbers having any number of digits
Ex:

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

How can I grab X.Y and store it in another variable?

EDIT:

I wasn't right with my wording, but I want to store X.Y into new variable not individual X & Y's I'm looking to finally have a variable version which has X.Y grabbed from bundle:
version="X.Y"


Solution 1:

I would use awk:

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

Now if you want to assign to x, y, z use read and process substitution:

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

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

If you just want the value of X.Y as a single value this is still great use for awk:

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

And if you then want to put that into a variable:

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

Or you can use cut in this case to get the third field:

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

Solution 2:

Like that:

$ 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

You can merge X and Y into a single variable:

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