【问题标题】:How to extract the port number from a listen address如何从监听地址中提取端口号
【发布时间】:2021-10-07 03:17:36
【问题描述】:

我想从地址字符串中提取端口号。整个字符串如下所示:

connect single-cluster --listen-addr=127.0.0.1:12345 --filename=hello

connect single-cluster --listen-addr=127.0.0.1 --filename=hello

我想将listen-addr 中的地址和端口保存到两个变量:ADDRPORT。如果输入字符串中不存在端口,只需将PORT变量留空,并设置ADDR即可。

现在如果输入字符串中存在端口号,我可以使用这个正则表达式:

ORI_STR="connect single-cluster --listen-addr=127.0.0.1:12345 --filename=hello"

LISTEN_ADDR_REGEX="(^|[[:space:]])--listen-addr=(([^[:space:]]+):([^[:space:]]+))($|[[:space:]])"

[[ $ORI_STR =~ $LISTEN_ADDR_REGEX ]] && ADDR=${BASH_REMATCH[3]} && PORT=${BASH_REMATCH[4]}

echo "ADDR=$ADDR"
echo "PORT=$PORT"

这给了我:

ADDR=127.0.0.1
PORT=12345

但是我不知道如何在原始字符串中包含端口号未设置的情况。 (即ORI_STR 中没有:12345)。

【问题讨论】:

    标签: regex bash shell


    【解决方案1】:

    ? 表示零匹配或匹配。

    #!/usr/bin/env bash
    
    #ori_str="connect single-cluster --listen-addr=127.0.0.1:12345 --filename=hello"
    
    ori_str="connect single-cluster --listen-addr=127.0.0.1 --filename=hello"
    
    listen_addr_regex="^.* --listen-addr=([^:]+)(:)?([^[:space:]]+)? .*$"
    
    [[ $ori_str =~ $listen_addr_regex ]] && addr=${BASH_REMATCH[1]} && port=${BASH_REMATCH[3]}
    
    echo "addr=$addr"
    echo "port=$port"
    

    • 使用"${port:-none}"none 用作默认值,或者根据需要将none 更改为其他值

    【讨论】:

      【解决方案2】:

      无论有没有端口都可以:

      LISTEN_ADDR_REGEX="(^|[[:space:]])--listen-addr=(([^[:space:]:]+)(:([^[:space:]]+))?)($|[[:space:]])"
      #                                                            ^   ^                ^^
      
      [[ $ORI_STR =~ $LISTEN_ADDR_REGEX ]] && ADDR=${BASH_REMATCH[3]} && PORT=${BASH_REMATCH[5]}
      #                                                                                      ^
      
      echo "ADDR=$ADDR"
      echo "PORT=$PORT"
      

      我在:port 部分周围添加了括号,并用? 将其标记为可选。这将端口从匹配组4 移动到5。我还在 IP 地址的排除列表中添加了:;没有 IP 贪婪地匹配端口。

      很难发现差异,所以我用^ 插入符号标记了它们。

      【讨论】:

        猜你喜欢
        • 2012-09-26
        • 2018-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多