我基本上想要将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时,也没有设置任何变量......似乎我做了很多错误但却无法确切地知道是什么。
答案 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
答案 1 :(得分:0)
这是重复的,请参阅Bash script, read values from stdin pipe 特别是,bash内置的“shopt -s lastpipe”将导致“read”命令在此shell中执行而不是子shell。