从环境变量中提取子字符串

从环境变量中提取子字符串

在 bash 或 zsh 脚本中,如果后者位于环境变量中,我如何从 url(例如unix.stackexchange.comfrom ) 中提取主机?http://unix.stackexchange.com/questions/ask

答案1

您可以使用参数扩展,该功能在任何符合 POSIX 标准的 shell 中都可用。

$ export FOO=http://unix.stackexchange.com/questions/ask
$ tmp="${FOO#*//}" # remove http://
$ echo "${tmp%%/*}" # remove everything after the first /
unix.stackexchange.com

一种更可靠但更丑陋的方法是使用实​​际的 URL 解析器。这是一个示例python

$ python3 -c 'import sys; from urllib.parse import urlparse; print(urlparse(sys.argv[1]).netloc)' "$FOO"
unix.stackexchange.com

答案2

如果 URL 都遵循这种模式,我有一个简短而丑陋的 hack 给你:

echo "$FOO" | cut -d / -f 3

答案3

您可以通过多种方式做到这一点,其中一些是:

export _URL='http://unix.stackexchange.com/questions/ask'

echo "$_URL" | sed -ne 'y|/|\n|;s/.*\n\n/;P'

expr "$_URL" : 'http://\([^/]*\)'

echo "$_URL" |  perl -lpe '($_) = m|^http://\K[^/]+|g'

perl -le 'print+(split m{/}, $ENV{_URL})[2]'

(set -f; IFS=/; set -- $_URL; echo "$3";)

答案4

也可以使用正则表达式组来完成:

$ a="http://unix.stackexchange.com/questions/ask"
$ perl -pe 's|(.*//)(.*?)(/.*)|\2|' <<<"$a"
unix.stackexchange.com

相关内容