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

标签 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 时,也没有设置任何变量...似乎我做错了很多事情,但无法准确地发现是什么。

最佳答案

使用 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

关于regex - 如何从 Bash 中的正则表达式中提取多个环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37554473/

相关文章:

javascript - 正则表达式 : Matching everything except regex values in Javascript

linux - Redis Sentinel 用于监控目的?通知脚本触发次数过多

linux - 如何使用symfony4在远程ubuntu服务器上执行linux命令?

linux - Bash 中的锁定文件 : Text file busy when running two copies at once

Java正则表达式: avoiding logical operator

c# - Entity Framework - 如何将我的特定代码转换为 MySQL 可以理解的表达式

javascript - 在没有 npm 的情况下使用 socket.io 和 express 模块

bash - 使用 xargs 和 xargs -i 的细微差别

bash - 如何从 Chrome 复制 cookie?

javascript - 如何在 Javascript 中正则表达式两个标记之间的字符串?