Shahar Hamuzim Rajuan
Shahar Hamuzim Rajuan

Reputation: 6159

Extract substring from a variables between two patterns in bash with special characters

I am trying to Extract substring from variables between two patterns in bash that as special characters inside the variable.

The variable:

MQ_URI=ssl://b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com:61617?jms.prefetchPolicy.queuePrefetch=0

What I've tried so far:

echo "$MQ_URI" | sed -E 's/.*ssl:// (.*) :61617.*/\1/'

Got me this in response:

sed: -e expression #1, char 12: unknown option to `s'

Also tried with grep:

echo $MQ_URI | grep -o -P '(?<=ssl://).*(?=:61617jms.prefetchPolicy.queuePrefetch=0)

The output I need is everything between: "ssl://" and ":61617?jms.prefetchPolicy.queuePrefetch=0"

which is : "b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com"

Upvotes: 1

Views: 65

Answers (3)

RavinderSingh13
RavinderSingh13

Reputation: 133760

With your shown samples and attempts please try following codes.

##Shell variable named `mq_uri` being created here.
##to be used in following all solutions.
mq_uri="ssl://b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com:61617?jms.prefetchPolicy.queuePrefetch=0"

1st solution: Using awk's match function along with split` function here.

awk 'match($0,/^ssl:.*:61617\?/){split(substr($0,RSTART,RLENGTH),arr,"[/:]");print arr[4]}' <<<"$mq_uri"

2nd solution: Using GNU grep along with its -oP options and its \K option to get required output.

grep -oP '^ssl:\/\/\K[^:]*(?=:61617\?)' <<<"$mq_uri"

3rd solution: Using match function of awk along with using gsub to Globally substitute values to get required output.

awk 'match($0,/^ssl:.*:61617\?/){val=substr($0,RSTART,RLENGTH);gsub(/^ssl:\/\/|:.*\?/,"",val);print val}' <<<"$mq_uri"

4th solution: Using awk's match function along with its array creation capability in GNU awk.

awk 'match($0,/^ssl:\/\/(.*):61617\?/,arr){print arr[1]}' <<<"$mq_uri"

5th solution: With perl's One-liner solution please try following code.

perl -pe 's/ssl:\/\/(.*):61617\?.*/\1/' <<<"$mq_uri"

Upvotes: 1

sseLtaH
sseLtaH

Reputation: 11247

Using bash

$ mq_uri=${mq_uri##*/}
$ mq_uri=${mq_uri//:*}
$ echo "$mq_uri"
b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com

sed

$ sed -E 's~[^-]*/([^?]*):.*~\1~' <<< "$mq_uri" 
b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com

grep

$ grep -Po '[^-]*/\K[^:]*' <<< "$mq_uri" 
b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com

awk

$ awk -F'[/:]' '{print $4}' <<< "$mq_uri" 
b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com

Upvotes: 3

Diego Torres Milano
Diego Torres Milano

Reputation: 69396

If this is what you expect

echo "$MQ_URI" | sed -E 's@.*ssl://(.*):61617.*@\1@'
b-7dda5da6-59a5-4150-8e2f-16534985665-1.mq.us-east-1.amazonaws.com

replace the delimiters by @ or anything not found in the string.

Upvotes: 1

Related Questions