Regular Expression in Bash Script

Robbie picture Robbie · Jun 10, 2013 · Viewed 68.7k times · Source

Hello awesome community,

I'm a complete dope when it comes to regex. I've put off learning it.. and now my laziness has caught up with me.

What I'm trying to do:
Check if a string matches this format:

10_06_13

ie. Todays date, or a similar date with "2digits_2digits_2digits"

What I've done:

regex='([0-9][0-9][_][0-9][0-9][_][0-9][0-9])'
if [[ "$incoming_string" =~ $regex ]]
then
   # Do awesome stuff here
fi

This works to a certain extent. But when the incoming string equals 011_100_131 ... it still passes the regex check.

I'd be grateful if anyone could help point me in the right direction.
Cheers

Answer

rici picture rici · Jun 10, 2013

=~ succeeds if the string on the left contains a match for the regex on the right. If you want to know if the string matches the regex, you need to "anchor" the regex on both sides, like this:

regex='^[0-9][0-9][_][0-9][0-9][_][0-9][0-9]$'
if [[ $incoming_string =~ $regex ]]
then
  # Do awesome stuff here
fi

The ^ only succeeds at the beginning of the string, and the $ only succeeds at the end.

Notes:

  1. I removed the unnecessary () from the regex and "" from the [[ ... ]].
  2. The bash manual is poorly worded, since it says that =~ succeeds if the string matches.