如何从包含--listen-addr参数的命令串中提取IP地址与端口号
实现方案
修改思路:把地址后的:加端口的部分标记为可选匹配组,未匹配时对应捕获组内容自动为空即可。
完整可运行代码:
# 示例1:带端口的输入 ORI_STR="connect single-cluster --listen-addr=127.0.0.1:12345 --filename=hello" # 示例2:不带端口的输入,注释掉上面一行放开下面一行即可测试 # ORI_STR="connect single-cluster --listen-addr=127.0.0.1 --filename=hello" # 修改后的正则:将:端口部分设为可选匹配 LISTEN_ADDR_REGEX="(^|[[:space:]])--listen-addr=([^[:space:]:]+)(:([^[:space:]]+))?($|[[:space:]])" if [[ $ORI_STR =~ $LISTEN_ADDR_REGEX ]]; then ADDR=${BASH_REMATCH[2]} PORT=${BASH_REMATCH[4]:-} # 未匹配到端口时默认赋值为空 fi echo "ADDR=$ADDR" echo "PORT=$PORT"
运行效果
- 带端口输入的输出:
ADDR=127.0.0.1 PORT=12345
- 不带端口输入的输出:
ADDR=127.0.0.1 PORT=
正则修改说明
- 把原来的
([^[:space:]]+):([^[:space:]]+)拆分为([^[:space:]:]+)(:([^[:space:]]+))? [^[:space:]:]+匹配地址部分,排除了冒号,避免把端口内容误算进地址(:([^[:space:]]+))?整个分组加?标记为可选,仅当存在冒号加端口时才会匹配,对应第4个捕获组为端口值- 用
${BASH_REMATCH[4]:-}的参数展开语法,保证未匹配到端口时变量为空,不会出现未定义报错
内容的提问来源于stack exchange,提问作者IsaIkari
相关产品推荐
相关产品推荐

