Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

extract server name from git clone URL

Tags:

sed

I have this

$ cat test.sh
echo "https://bitbucket.dev.global.server.com/scm/xyz/abd.git"
echo "ssh://[email protected]:6699/xyz/abc.git"
echo "http://bitbucket.dev.global.server.com/abc"
echo "ssh://[email protected]/xyz/abc"
echo "http://bitbucket.dev.global.server.com"
echo "ssh://[email protected]/xyz/abc.git"

I want an one liner command (preferably sed command) that will extract the server name from the URL. e.g.

bitbucket.dev.global.server.com

I tried this but it doesn't work

$ ./test.sh | sed 's/\(\/\/\|\@\)/&\n/;s/.*\n//;s/\(\:\|\/\)/\n&/;s/\n.*//'
bitbucket.dev.global.server.com
[email protected]
bitbucket.dev.global.server.com
[email protected]
bitbucket.dev.global.server.com
[email protected]

It still got the user and @ symbol. How to do this?

like image 877
Ramanan T Avatar asked Sep 07 '26 11:09

Ramanan T


2 Answers

I want an one liner command (preferably sed command)

Since you requested a sed one-liner, you can try this:

./test.sh | sed -E 's|.*://([^/@:]+@)?([^/@:]+).*|\2|'

which outputs this:

bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com

Explanation:

./test.sh | sed -E '
  s| .*://        # Match all up to "://"
     ([^/@:]+@)?  # Match "user@" or "git@"
     ([^/@:]+)    # The hostname
     .*           # Match all after the hostname and discard it
  |\2|'          # Replace full match with hostname, and then it's done
like image 195
Robert Long Avatar answered Sep 11 '26 22:09

Robert Long


Try this, using perl, sed like syntax:

bash test.sh | perl -pe 's|.*://(?:\w+@)?([\w.]+)/?.*|\1|'

The regular expression matches as follows:

Node Explanation
.* any character except \n (0 or more times (matching the most amount possible))
:// '://'
(?: group, but do not capture (optional (matching the most amount possible)):
\w+ word characters (a-z, A-Z, 0-9, _) (1 or more times (matching the most amount possible))
@ @
)? end of grouping
( group and capture to \1:
[\w.]+ any character of: word characters (a-z, A-Z, 0-9, _), '.' (1 or more times (matching the most amount possible))
) end of \1
/? '/' (optional (matching the most amount possible))
.* any character except \n (0 or more times (matching the most amount possible))

or with GNU grep in PCRE mode:

bash test.sh | grep -oP '://(?:\w+@)?\K[\w.]+(?>=/)?' 

The regular expression matches as follows:

Node Explanation
:// '://'
(?: group, but do not capture (optional (matching the most amount possible)):
\w+ word characters (a-z, A-Z, 0-9, _) (1 or more times (matching the most amount possible))
@ @
)? end of grouping
\K resets the start of the match (what is Kept) as a shorter alternative to using a look-behind assertion: look arounds and Support of \K in regex
[\w.]+ any character of: word characters (a-z, A- Z, 0-9, _), '.' (1 or more times (matching the most amount possible))
(?> match (and do not backtrack afterwards) (optional (matching the most amount possible)):
=/ '=/'
)? end of look-ahead

yields:

bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
bitbucket.dev.global.server.com
like image 30
Gilles Quenot Avatar answered Sep 11 '26 22:09

Gilles Quenot



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!