在bash变量中找到一个子字符串

时间:2010-11-22 18:17:06

标签: bash

我们试图找到mercurial网址的用户名:

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

假设总有一个用户名,我想出了:

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

有没有办法在一行中做到这一点?

4 个答案:

答案 0 :(得分:4)

假设你的字符串是这样的变量:

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

你可以这样做:

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

然后您的用户名就在这里:

echo ${BASH_REMATCH[1]}

这适用于Bash版本3.2及更高版本。

答案 1 :(得分:3)

你几乎需要更多的声明或呼唤外​​部工具。我认为sed最适合这个。

sed -r -e 's|.*://(.*)@.*|\1|' <<< "$default"

答案 2 :(得分:0)

不在bash内部。您必须委托外部工具,如sed。

答案 3 :(得分:0)

不熟悉mercurial,但是使用你的网址,你可以做到

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

可能不是两个管道最有效的方法,但有效。