如何从Bash中的正则表达式中提取多个环境变量?

时间:2016-05-31 19:50:53

标签: regex linux bash

我基本上想要将URL中的部分提取到不同的环境变量中供以后使用,所以我希望能够做到这样的事情:

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时,也没有设置任何变量......似乎我做了很多错误但却无法确切地知道是什么。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是重复的,请参阅Bash script, read values from stdin pipe 特别是,bash内置的“shopt -s lastpipe”将导致“read”命令在此shell中执行而不是子shell。