在bash变量中查找子字符串

在bash变量中查找子字符串,bash,Bash,我们试图找到mercurial url的用户名: default = ssh://someone@acme.com//srv/hg/repo 假设总是有一个用户名,我想到: tmp=${a#*//} user=${tmp%%@*} 有没有一种方法可以在一行中实现这一点?而不是在bash本身中。您必须委托给一个外部工具,如sed。不熟悉mercurial,但使用您的url,您可以这样做 echo 'ssh://someone@acme.com/srv/hg/repo' |grep -E --o

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

default = ssh://someone@acme.com//srv/hg/repo
假设总是有一个用户名,我想到:

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

有没有一种方法可以在一行中实现这一点?

而不是在bash本身中。您必须委托给一个外部工具,如sed。

不熟悉mercurial,但使用您的url,您可以这样做

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

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

您需要更多的语句或调用外部工具。我认为sed是最好的选择

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

sed-r-e的|.*://(.*)@.*.\1 |'假设字符串位于如下变量中:

url='default = ssh://someone@acme.com//srv/hg/repo'
你可以做:

[[ $url =~ //([^@]*)@ ]]
那么您的用户名在这里:

echo ${BASH_REMATCH[1]}

这在Bash版本3.2及更高版本中有效。

在两个操作之间使用分号(而不是换行符)算数吗?我不记得以前见过这种构造,
我想是的,因为echo和管道意味着整个“另一个子shell”,而here字符串是在处理过程中处理的。