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"