Home > Software design >  Cross platform regex substring match for git
Cross platform regex substring match for git

Time:10-15

Sorry for yet another pattern matching question, but I'm struggling to to find a tool that will do a regex in a git hook. It needs to work on Windows, Mac and Linux.

This gnu grep works for Windows and Linux, but not Mac (because bsd)

echo "feature/EOPP-234-foo" | grep -Po -e '[A-Z]{4}-\d{1,5}'

This works for Mac and Linux, but not windows (because <git>\usr\bin\egrep don't seem to work)

echo "feature/EOPP-234-foo" | egrep -o '[A-Z]{4}-\d{1,5}'

sed might be the most common tool, but stuffed if I can get it to match:

echo "feature/EOPP-234-foo" | sed -n 's/^.*\([A-Z]{4}\-\d{1,5}\).*$/\1/p'

I've even tried bash matching with no luck

[[ "feature/EOPP-234-foo" =~ ([A-Z]{4}-\d{1,5}) ]] && echo ${BASH_REMATCH[1]}

Any ideas?

CodePudding user response:

When you need to make POSIX tools run on Windows, you need to remember to use double quotation marks around your commands, not single quotes.

Also, you can use a common POSIX ERE compliant regex across all these environments. This means \d must be replaced with [0-9] or [[:digit:]] as \d is a PCRE only compliant construct.

You can use

grep -Eo "[A-Z]{4}-[0-9]{1,5}"
grep -Eo "[A-Z]{4}-[[:digit:]]{1,5}"

CodePudding user response:

I suggest:

echo "feature/EOPP-234-foo" | grep -o -e "[A-Z]\{4\}-[0-9]\{1,5\}"

or

[[ "feature/EOPP-234-foo" =~ ([A-Z]{4}-[0-9]{1,5}) ]] && echo "${BASH_REMATCH[1]}"
  • Related