从字符串中提取数字

从字符串中提取数字

当使用这个 ubuntu 命令时:

${HOME}/temp/.git describe --always --tags HEAD 

该命令的输出是:

v0.1.5-2-p343h3d3

我想1.5从上面的输出中提取并检查它是否大于 1.5。
有什么解决方案吗?

答案1

版本号实际上很难比较,因为它们通常不是标准的数学比较(例如,这个版本号有两个小数点,让人感到bc困惑)。

因此,我转向一个鲜为人知的选项,sort它可用于对版本字符串进行排序。考虑以下内容:

$ echo -e "v0.1.5\nv0.1.6-2-p343h3d3" | sort -V
v0.1.5
v0.1.6-2-p343h3d3

oli@bert:~$ echo -e "v0.1.5\nv0.1.4-2-p343h3d3" | sort -V
v0.1.4-2-p343h3d3
v0.1.5

这基本上意味着我们可以对版本进行排序,以便最新版本位于最后一行。然后我们要做的就是在if或快捷方式 if 内对最后一行进行字符串比较:

[[ $(echo -e "v0.1.5\nv0.1.4-2-p343h3d3" | sort -V | tail -1) != "v0.1.5" ]] && echo NEWER

摆弄一下v0.1.4-2-p343h3d3绳子。如果你把它粘在上面,0.1.6它就会发出回声。

现在将这一切重新带回到你的命令中:

[[ $(echo -e "v0.1.5\n$(${HOME}/temp/.git describe --always --tags HEAD)" | sort -V | tail -1) != "v0.1.5" ]] && echo NEWER

或者你可以将其分解为以下形式以便于阅读:

THRESHOLD="v0.1.5"
VERSION=$(${HOME}/temp/.git describe --always --tags HEAD)
if [[ $(echo -e "$THRESHOLD\n$VERSION" | sort -V | tail -1) != "$THRESHOLD"  ]]; then
    echo GREATER
fi

答案2

你可以做类似的事情

${HOME}/temp/.git describe --always --tags HEAD  | awk ' {
                             match ($0, /[0-9]+\.[0-9]+\.[0-9]+/,m)
                             if(m[0]>"0.1.5"){ 
                                 print("hello")
                              }
                             }'

这将检查第一个匹配的正则表达式结果。这只是另一种方法,尽管我不确定这种方法对你来说有多实用。

干杯

答案3

如果提取的版本大于 1.5,则可以使用以下命令来exit查看状态0

${HOME}/temp/.git describe --always --tags HEAD | perl -ne '/v\d+\.(\d+\.\d+)/;exit(1) if $1 <= 1.5'

相关内容