mystack
mystack

Reputation: 5492

Regular expression to match path in bash condition

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.

Upvotes: 1

Views: 1658

Answers (3)

anubhava
anubhava

Reputation: 785068

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 ]]

Upvotes: 2

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626758

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.

Upvotes: 1

user18098820
user18098820

Reputation:

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

Upvotes: 2

Related Questions