How to match digits in regex in bash script

RegexBash

Regex Problem Overview


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?

Regex Solutions


Solution 1 - Regex

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 - Regex

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPawel P.View Question on Stackoverflow
Solution 1 - RegexfedorquiView Answer on Stackoverflow
Solution 2 - RegexanubhavaView Answer on Stackoverflow