grep
, sed
, awk
and perl
have been used to match a string against a regular expression, but the Bash shell has this functionality built into it as well!
In Bash, the =~
operator allows you to match a string on the left against an extended regular expression on the right and returns 0 if the string matches the pattern, and 1 otherwise. Capturing groups are saved in the array variable BASH_REMATCH
with the first element, Group 0, representing the entire expression.
The following script matches a string against a regex and prints out the capturing groups:
#!/bin/bash if [ $# -lt 2 ] then echo "Usage: $0 regex string" >&2 exit 1 fi regex=$1 input=$2 if [[ $input =~ $regex ]] then echo "$input matches regex: $regex" #print out capturing groups for (( i=0; i<${#BASH_REMATCH[@]}; i++)) do echo -e "\tGroup[$i]: ${BASH_REMATCH[$i]}" done else echo "$input does not match regex: $regex" fiExample usage:
sharfah@starship:~> matcher.sh '(.*)=(.*)' foo=bar foo=bar matches regex (.*)=(.*) Group[0]: foo=bar Group[1]: foo Group[2]: bar