4

we were trying to find the username of a mercurial url:

default = ssh://someone@acme.com//srv/hg/repo

Suppose that there's always a username, I came up with:

tmp=${a#*//}
user=${tmp%%@*}

Is there a way to do this in one line?

zedoo
  • 10,562
  • 12
  • 44
  • 55

4 Answers4

5

Assuming your string is in a variable like this:

url='default = ssh://someone@acme.com//srv/hg/repo'

You can do:

[[ $url =~ //([^@]*)@ ]]

Then your username is here:

echo ${BASH_REMATCH[1]}

This works in Bash versions 3.2 and higher.

Dennis Williamson
  • 346,391
  • 90
  • 374
  • 439
3

You pretty much need more that one statement or to call out to external tools. I think sed is best for this.

sed -r -e 's|.*://(.*)@.*|\1|' <<< "$default"
sorpigal
  • 25,504
  • 8
  • 57
  • 75
  • I don't remember seeing that construct before - the `<<<` - so I just learned something new. Usually I `echo` the variable into `sed`; I would imagine this construct is more efficient? – Will Nov 23 '10 at 16:47
  • I imagine it is, since an echo and a pipe means a whole 'nother subshell whereas a here string is handled in process. – sorpigal Nov 24 '10 at 12:00
0

Not within bash itself. You'd have to delegate to an external tool such as sed.

Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358
0

Not familiar with mercurial, but using your url, you can do

echo 'ssh://someone@acme.com/srv/hg/repo' |grep -E --only-matching '\w+@' |cut --delimiter=\@ -f 1

Probably not the most efficient way with the two pipes, but works.

Will
  • 3,500
  • 4
  • 30
  • 38