首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用grep命令和正则表达式提取jdk版本。

无法使用grep命令和正则表达式提取jdk版本。
EN

Stack Overflow用户
提问于 2020-11-29 13:33:13
回答 3查看 348关注 0票数 0

我试图使用jdk提取regular-expressions版本,实际上我有以下版本:

代码语言:javascript
复制
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04, mixed mode,sharing)

我写了大书。它看起来如下所示:^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}$

这个正则表达式正在在线regex测试器 (https://regex101.com/)上工作。不幸的是,没有使用grep-命令。我使用的是扩展正则表达式。我提取jdk版本的代码如下所示:

代码语言:javascript
复制
CMD_RESULT=$(java --version 2>&1 | head -n 1 | cut -d '' -f 2)
if [ ! -z "$CMD_RESULT" ]
then 
    for token in $CMD_RESULT
    do
       JAVA_VERSION=$(echo $token |  grep -e $VERSION_EXTRACTION_REGEX)
       if [ ! -z  $JAVA_VERSION ];
       then
            printf "${GREEN}Java version: [$JAVA_VERSION]\n"
       fi
     done
fi

我不明白,为什么我的regex正在使用在线regex检查器,而它却不使用grep-命令。我将参数-e用于扩展regexp。

知道吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-29 15:05:02

对OPs当前代码的一些小更改:

注释中提到的

  • ^$表示输入的开始和结束;从regex
  • 中删除这些,而grep可以使用结果regex,必须告诉grep-Ex regex模式下运行H 29H 110我们可以使用d11选项将输出限制到与regexH 213f 214/code>匹配的部分。

样本输入数据:

代码语言:javascript
复制
$ cat jdk.dat
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04, mixed mode,sharing)

一个使用OP修改正则表达式的grep解决方案:

代码语言:javascript
复制
$ grep -oE '[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}' jdk.dat
11.0.9.1
11.0.9.1
11.0.9.1

同样的事情,但是使用操作系统变量中存储的regex:

代码语言:javascript
复制
$ VERSION_EXTRACTION_REGEX='[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}'
$ grep -oE "${VERSION_EXTRACTION_REGEX}" jdk.dat
11.0.9.1
11.0.9.1
11.0.9.1

注意事项:我将由用户来决定使用哪个值,例如,只使用第一个输入行(openjdk 11.0.9.1 2020-11-04)的head -n 1

票数 1
EN

Stack Overflow用户

发布于 2020-11-29 16:19:53

只使用本机Bash命令解析java版本字符串即可:

代码语言:javascript
复制
#!/usr/bin/env bash

# Capture java command path if it exists OR exit fail
java_cmd=$(command -v java) || exit 1

# Capture java raw version output
java_raw_version=$("$java_cmd" -version 2>&1)

# Match java raw version string against Bash Regex OR dump debug if match fail
[[ $java_raw_version =~ ([0-9]+)\.([0-9]+)\.([0-9]+)[_.+-]([0-9]+) ]] ||
  typeset -p java_raw_version BASH_REMATCH

major=${BASH_REMATCH[1]}   # Regex capture group 1
minor=${BASH_REMATCH[2]}   # Regex capture group 2
patch=${BASH_REMATCH[3]}   # Regex capture group 3
release=${BASH_REMATCH[4]} # Regex capture group 4

# Recompose a semantic version string
semver="$major.$minor.$patch-$release"

printf 'Java semantic version is: %s\n' "$semver"

抽样产出:

发自:

代码语言:javascript
复制
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~20.10-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)

输出:

代码语言:javascript
复制
Java semantic version is: 1.8.0-275

发自:

代码语言:javascript
复制
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04, mixed mode,sharing)

输出:

代码语言:javascript
复制
Java semantic version is: 11.0.9-1

关于语义版本控制,请参阅:https://semver.org/

票数 1
EN

Stack Overflow用户

发布于 2020-11-29 17:12:21

下面是一个非常简单的awk解决方案(不需要regexp):

代码语言:javascript
复制
#!/usr/bin/env bash

# Capture java command path if it exists OR exit fail
java_cmd=$(command -v java) || exit 1

# Capture java raw version output
java_raw_version=$("$java_cmd" -version 2>&1)

# print out the Java version:
echo $java_raw_version | awk -F \" 'NR==1{print "Java semantic version is: "$2}''

解释:

-F \"将awk字段分隔符设置为"

NR==1只处理#1行

print "Java semantic version is: "$2在文本和打印中附加第二个字段

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65060660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档