我基本上想将 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 时,也没有设置任何变量...似乎我做错了很多事情,但无法准确地发现是什么。
最佳答案
使用 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
关于regex - 如何从 Bash 中的正则表达式中提取多个环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37554473/