I have to fetch major and minor version combined together as one number in bash script.
For example: From 'Python 3.10.2', I need 310
sed 's/.* \([0-9]\).\([0-9]\).*/\1\2/'
works perfectly when the minor version is single digit and it fails when it is double digit.
Hence, i tried sed -E 's/.* \([0-9] \).\([0-9] \).*/\1\2/'
. But this throws an error
for example: echo "Python 3.10.2" | sed -E 's/.* \([0-9] \).\([0-9] \).*/\1\2/'
results in an error
As a workaround, i am using echo "Python 3.10.2" | grep -Eo '[0-9] .[0-9] ' | sed s/[.]//g
Is there a way to get what i need in one sed without using grep like how i am doing currently?
Thanks,
Strive
CodePudding user response:
You're probably getting an error message about \1
and \2
not being available/populated since in this code:
echo "Python 3.10.2" | sed -E 's/.* \([0-9] \).\([0-9] \).*/\1\2/'
you're escaping the (
and )
that would populate those cap[ture groups. You need to escape them in BREs, but you're using EREs, courtesy of -E
and so you have to leave them unescaped:
$ echo "Python 3.10.2" | sed -E 's/.* ([0-9] ).([0-9] ).*/\1\2/'
310
The .
in the middle of the regexp should really be escaped as \.
CodePudding user response:
This is probably what you want:
sed -E 's/^. |\.[0-9]*$|\.//g'
this removes everything from
- the beginning uptil a space
- the end after and including the last dot
.
- removes every dot
.
in between
CodePudding user response:
Using sed
$ echo "Python 3.10.2" | sed -E 's/[[:alpha:] [:punct:]]|[[:digit:]] $//g'
310