How to match digits in regex in bash script

I'm trying to match some lines against regex that contains digits.

Bash version 3.2.25:

#!/bin/bash

s="AAA (bbb 123) CCC"
regex="AAA \(bbb \d+\) CCC"
if [[ $s =~ $regex ]]; then
  echo $s matches $regex
else
  echo $s doesnt match $regex
fi

Result:

AAA (bbb 123) CCC doesnt match AAA \(bbb \d+\) CCC

If I put regex="AAA \(bbb .+\) CCC" it works but it doesn't meet my requirement to match digits only.

Why doesn't \d+ match 123?


Solution 1:

Either use standard character set or POSIX-compliant notation:

[0-9]    
[[:digit:]]    

As read in Finding only numbers at the beginning of a filename with regex:

\d and \w don't work in POSIX regular expressions, you could use [:digit:] though

so your expression should be one of these:

regex="AAA \(bbb [0-9]+\) CCC"
#                ^^^^^^
regex="AAA \(bbb [[:digit:]]+\) CCC"
#                ^^^^^^^^^^^^

All together, your script can be like this:

#!/bin/bash

s="AAA (bbb 123) CCC"
regex="AAA \(bbb [[:digit:]]+\) CCC"
if [[ $s =~ $regex ]]; then
  echo "$s matches $regex"
else
  echo "$s doesn't match $regex"
fi

Let's run it:

$ ./digits.sh
AAA (bbb 123) CCC matches AAA \(bbb [[:digit:]]+\) CCC

Solution 2:

Digit notation \d doesn't work with your bash version. Use [0-9] instead:

regex="AAA \(bbb [0-9]+\) CCC"