2016-05-31 3 views
0

は、私は基本的に後で使用するために別の環境変数へのURLから部品を抽出したいので、私はこのような何かを行うことができるように期待しています:Bashの正規表現から複数の環境変数を抽出するには?

echo "my-app.domain.com:8080" | \ 
sed -r 's/((\w+)\.)?(\w+\.\w+)(\:(\d+))?/\2\n\3\n\5/g' | \ 
read SUBDOMAIN DOMAIN PORT 

は、しかし、これは動作していないように(とために何らかの理由「:」ポートから常に「\ 5」で出力されます):

sh-4.2# echo "my-app.domain.com:8080" | \ 
sed -r 's/((\w+)\.)?(\w+\.\w+)(\:(\d+))?/\2\n\3\n\5/g' 
my-app 
domain.com 
:8080 

何私にはもっと奇妙であることは、私は\ 5の後に新しい行を印刷する場合、これが出力されるということです:

sh-4.2# echo "my-app.domain.com:8080" | sed -r 's/((\w+)\.)?(\w+\.\w+)(\:(\d+))?/\2\n\3\n\5\n/g' 
my-app 
domain.com 

:8080 

いずれにしても、読み込みを使用すると、いずれの変数も設定されていません...私は数多くのことを間違っているように見えますが、正確に何を見分けることはできません。 GNUのbashのでは

答えて

3

url="my-app.domain.com:8080" 
[[ $url =~ ([^.]*)\.(.*):(.*) ]] 
subdomain="${BASH_REMATCH[1]}" 
domain="${BASH_REMATCH[2]}" 
port="${BASH_REMATCH[3]}" 
echo "$subdomain $domain $port" 

出力:

 
my-app domain.com 8080 

参照:The Stack Overflow Regular Expressions FAQ

+0

これは...美しい – dukeofgaming

0

はこれが重複している、特にBash script, read values from stdin pipe を参照して、bashがビルトイン"shopt -s lastpipe"は "read"コマンドを実行させるでしょうサブシェルの代わりにこのシェル内でedを実行します。

関連する問題