【问题标题】:How to parse the correct version number?如何解析正确的版本号?
【发布时间】:2019-01-06 05:58:23
【问题描述】:

下面的命令会返回相应的字符串

$ docker-compose exec postgres postgres --version
postgres (PostgreSQL) 10.4 (Debian 10.4-2.pgdg90+1)

我正在尝试获取 postgresql 版本,但是当我尝试时,包含 Debian 版本和其他数字,例如

$ pg_version=$(docker-compose exec postgres postgres --version | sed 's/[^0-9.]//g')
10.410.42.901

我想知道如何只获得10.4

【问题讨论】:

标签: linux shell


【解决方案1】:

如下修改sed会有帮助,

sed -E 's/.*PostgreSQL[^0-9.]+([0-9.]*).*/\1/'

\1 只会匹配“PostgreSQL”后面的版本号。

【讨论】:

    【解决方案2】:

    pg_version=$(docker-compose exec postgres postgres -V | grep -oE '[.0-9]+' | head -1)

    【讨论】:

    • 10.4 10.4。该值返回。如何只返回一个10.4?
    • 由于两次找到版本,所以把head -1打印第一个。
    • @Sumit :我认为 egrep 模式 [.0-9]+ 在这种情况下就足够了。顺便说一句,最好写成grep -oE,因为egrep 已被弃用。
    • @user1934428 好的,谢谢
    【解决方案3】:
    • awk -v RS=" " '/^[0-9.]+$/{print; exit}'
    • grep -oE '[.0-9]+' | head -1
    • tr ' ' '\n' | grep -oE -m 1 '[.0-9]+'
    • sed 's|^[^0-9.]*\([0-9.]\+\).*|\1|'

    【讨论】:

      【解决方案4】:

      您可以将grep 与以下内容一起使用:

      $ grep -oP "PostgreSQL.\s\K.+?(?=\s)"
      

      例如:

      $ echo "postgres (PostgreSQL) 10.4 (Debian 10.4-2.pgdg90+1)" | grep -oP "SQL.\s\K.+?(?=\s)"
      10.4
      

      \K 可以被解读为排除左侧 *SQL)<space> 之前的所有内容,仅返回右侧部分 .+?(?=\s),直到找到空格 \s

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多