Linux 如何解析正确的版本号?

Linux 如何解析正确的版本号?,linux,shell,Linux,Shell,下面的命令将返回相应的字符串 $ 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'

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

$ 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
仅修改
sed
,如下所示会有所帮助

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

\1
仅与“PostgreSQL”后面的版本号匹配。

修改
sed
,如下所示会有所帮助

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

\1
仅与“PostgreSQL”后面的版本号匹配。

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

您可以将
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)
,只返回右边的部分
+?(?=\s)
,直到找到空间
\s

您可以将
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)
,只返回右侧部分
+?(?=\s)
,直到找到空间
\s

  • awk-v RS=“”/^[0-9.]+$/{print;exit}'
  • grep-oE'[0-9]+'| head-1
  • tr''\n'| grep-oE-m1'[0-9]+'
  • sed的|^[^0-9.]*\([0-9.]\+\)..|\1 |'
      • awk-v RS=“”/^[0-9.]+$/{print;exit}'
      • grep-oE'[0-9]+'| head-1
      • tr''\n'| grep-oE-m1'[0-9]+'
      • sed的|^[^0-9.]*\([0-9.]\+\)..|\1 |'

      您可以在空格等处进行黑客攻击。。。但我会使用另一种方法(比如SHOW server_版本):它仍然显示
      10.4(Debian 10.4-2.pgdg90+1)
      你可以在空格等处破解它。。。但是我会使用另一种方法(比如SHOW server_版本):它仍然显示
      10.4(Debian 10.4-2.pgdg90+1)
      10.4 10.4
      。此值返回。如何只返回一个10.4?因为它两次找到版本,所以将
      头-1
      放在第一个打印位置。@Sumit:我认为在这种情况下,egrep模式
      [.0-9]+
      就足够了。顺便说一句,最好将其写成
      grep-oE
      ,因为
      egrep
      已被弃用。@user1934428是的,谢谢
      10.4 10.4
      。此值返回。如何只返回一个10.4?因为它两次找到版本,所以将
      头-1
      放在第一个打印位置。@Sumit:我认为在这种情况下,egrep模式
      [.0-9]+
      就足够了。顺便说一句,最好将其写成
      grep-oE
      ,因为
      egrep
      已被弃用。@user1934428是的,谢谢