環境変数から部分文字列を抽出する

環境変数から部分文字列を抽出する

bashまたはzshスクリプトでunix.stackexchange.comURLが環境変数にある場合は、URL(たとえば)からホストをどのように抽出できますか?http://unix.stackexchange.com/questions/ask

答え1

すべてのPOSIX互換シェルで利用可能なパラメータ拡張を使用できます。

$ 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がすべてこのパターンに従う場合は、短くて見苦しい方法をお知らせします。

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

関連情報