Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extract substring before dot

I try to substract the first string before a dot (.) in bash.

For instance:

1.2.3 -> 1
11.4.1 -> 11

I used the following command based on the docs:

s=4.5.0
echo "${s%.*}"

But it ouptuts 4.5 instead of 4. I don't get it.

Why is that?

like image 675
Mornor Avatar asked Nov 22 '16 09:11

Mornor


2 Answers

You need to use %% to remove the longest match from the end:

$ echo "${s%%.*}"
4

From the docs:

${parameter%%word}
Remove Largest Suffix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the largest portion of the suffix matched by the pattern deleted.

like image 60
Tom Fenech Avatar answered Oct 22 '22 17:10

Tom Fenech


You can also use the bash Regular Expressions feature built-in in the recent versions of the shell (since bash 3.0), using the tilde(=~) operator.

$ string="s=4.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
4
$ string="s=32.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
32
like image 28
Inian Avatar answered Oct 22 '22 17:10

Inian