How to use Regular expression (regex) in Bash?
About
This article shous you how to use regular expression in Bash
Example
Conditional
tomatch='/php-status?full&json'
[[ "$tomatch" =~ '/php-status' ]] && echo match || echo does not match
[[ ! "$tomatch" =~ 'not' ]] && echo does not match || echo does match
Group Capture
This example shows you how you can capture a Group to extract text.
Example where we will extract a part of a file name
fileName="helloWorld.jpg"
# The regular expression starts with $' and ends with '
regex=$'(.*)\.jpg'
# double bracket is mandatory to use the regular expression operators
if [[ $fileName =~ $regex ]]
then
name="${BASH_REMATCH[1]}"
echo ${name}
else
echo "$fileName doesn't match"
fi
How it works? With the Bash Binary operator
When the regexp binary operator =~ is used, the string to the right of the operator is considered an extended regular expression and matched accordingly.
The operator has the same precedence as == and !=
The return value is:
- 0 if the string matches the pattern
- 2 if the regular expression is syntactically incorrect
- 1 otherwise.
Others:
- If the shell option nocasematch is enabled, the match is performed without regard to the case of alphabetic characters.
- Any part of the pattern may be quoted to force it to be matched as a string.
- Capturing group are saved in the BASH_REMATCH variable.
Glob
Note that pathname expansion use globbing as well as the control flow structure such as case