我试图使用jdk提取regular-expressions版本,实际上我有以下版本:
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版本的代码如下所示:
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。
知道吗?
发布于 2020-11-29 15:05:02
对OPs当前代码的一些小更改:
注释中提到的
^和$表示输入的开始和结束;从regex grep可以使用结果regex,必须告诉grep在-Ex regex模式下运行H 29H 110我们可以使用d11选项将输出限制到与regexH 213f 214/code>匹配的部分。样本输入数据:
$ 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解决方案:
$ 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:
$ 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
发布于 2020-11-29 16:19:53
只使用本机Bash命令解析java版本字符串即可:
#!/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"抽样产出:
发自:
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)输出:
Java semantic version is: 1.8.0-275发自:
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)输出:
Java semantic version is: 11.0.9-1关于语义版本控制,请参阅:https://semver.org/
发布于 2020-11-29 17:12:21
下面是一个非常简单的awk解决方案(不需要regexp):
#!/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在文本和打印中附加第二个字段
https://stackoverflow.com/questions/65060660
复制相似问题