在Bash变量中查找子字符串

4
我们试图找到Mercurial URL的用户名:
default = ssh://someone@acme.com//srv/hg/repo

假设总是有一个用户名,我想到了以下方法:

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

有没有一行代码可以实现这个功能?

在两个操作之间使用分号(而不是换行符)是否算作一种写法? - Jonathan Leffler
4个回答

5
假设你的字符串存储在一个变量中,如下所示:
url='default = ssh://someone@acme.com//srv/hg/repo'

您可以做以下操作:

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

然后你的用户名在这里:
echo ${BASH_REMATCH[1]}

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


3

你几乎需要多个语句或调用外部工具。我认为sed最适合这种情况。

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

我不记得以前见过这个结构 - <<< - 所以我刚学到了新东西。通常我会将变量“echo”到“sed”中; 我想这个结构更有效率? - Will
我认为是这样的,因为回声和管道意味着一个完整的子shell,而here字符串在进程中处理。 - sorpigal

0

这不是bash本身的功能。您需要委派给外部工具,例如sed。


0

虽然不熟悉mercurial,但使用您的url,您可以执行以下操作

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

也许使用两个管道不是最有效的方式,但它能够正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接