I'm looking to write a regular expression to match the following paths.
puts/push/1234/request
puts/push/57689/request
puts/push/123/request
puts/push/4567/request
puts/push/34/request
Have a variable name Targetpath and any of the above path could be it's value. I have the following conditional expression to perform the match.
if [[ $Targetpath =~ puts/push/*/request ]]; then echo 1; else echo 0; fi
But the match is not happening and getting 0 echod to the terminal always
How the above command should be modified to perform the correct match.
Try using the following regex string, modify the number of numerals if needed
regex="puts\/push\/[0-9]{2,}\/request"
if [[ $var =~ $regex ]]; then echo 1; else echo 0; fi
If you plan to match any text but / in place of your * you can use
if [[ $Targetpath =~ puts/push/[^/]+/request ]];
Note that [^/]+ is a negated bracket expression that matches one or more (since + in POSIX ERE is a one or more quantifier) chars other than a / char.
Or, if you intend to match digits where your * is:
if [[ $Targetpath =~ puts/push/[0-9]+/request ]];
Here, [0-9]+ (or [[:digit:]]+) matches one or more digits.
Here is a quick demo:
#!/bin/bash
Targetpath='puts/push/1234/request'
rx='puts/push/[0-9]+/request'
if [[ "$Targetpath" =~ $rx ]]; then echo 1; else echo 0; fi
# => 1
Note you do not need to escape slashes in this case as / are not regex delimiters here (in sed commands, you need to escape / if / is used as a regex delimiter char).
In case you do not care what char appear between puts/push/ and /request, simply use glob matching:
if [[ "$Targetpath" == puts/push/*/request ]]; then echo 1; else echo 0; fi
Note the == operator and * that matches any text. However, note that glob patterns match the whole text/string, so you might need * on both ends of it, too.
As I commented this requirement doesn't need regex. It can be done entirely in glob (or extglob):
Case 1: If you want to validate starting and ending part only then use:
[[ $Targetpath == puts/push/*/request ]]
Case 2: If you want to validate starting and ending part and allowing only digits in the middle part:
# enable extended glob
shopt -s extglob
[[ $Targetpath == puts/push/+([[:digit:]])/request ]]
Case 3: If you want to validate starting and ending part and allowing only 1+ of any non-/ characters the middle part:
# enable extended glob
shopt -s extglob
[[ $Targetpath == puts/push/+([!/])/request ]]