Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to match digits in regex in bash script

Tags:

regex

bash

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?

like image 956
Pawel P. Avatar asked Jul 31 '13 10:07

Pawel P.


1 Answers

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 
like image 101
fedorqui 'SO stop harming' Avatar answered Oct 08 '22 07:10

fedorqui 'SO stop harming'