2016-05-31 54 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 

在任何情況下,當使用read時,沒有一個變量被設置...似乎我正在做一些錯誤的事情,但我無法準確地發現問題。

回答

3

隨着GNU的bash:

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」將導致「讀取」命令執行在這個shell中而不是一個subshel​​l中編輯。

相關問題