在bash变量中查找子字符串

find a substring inside a bash variable

本问题已经有最佳答案,请猛点这里访问。

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

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

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

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

有没有一种方法可以做到这一点?


假设字符串在这样的变量中:

1
url='default = ssh://[email protected]//srv/hg/repo'

你可以做到:

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

那么您的用户名在这里:

1
echo ${BASH_REMATCH[1]}

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


您几乎需要更多的那个语句,或者调用外部工具。我认为塞德最适合这样做。

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


不熟悉mercurial,但是使用你的URL,你可以

1
echo 'ssh://[email protected]/srv/hg/repo' |grep -E --only-matching '\w+@' |cut --delimiter=\@ -f 1

可能不是最有效的两个管道,但工程。


不在bash内部。你必须委托给一个外部工具,比如sed。