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

Time:08-25

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"

CodePudding user response:

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

CodePudding user response:

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.

CodePudding user response:

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"
  • Related