sed版本提取

Sed version extract

我正在尝试从字符串中提取版本号。我找不到确切的正则表达式来找到我需要的东西。

例如-

1012-EPS-Test-OF-Something-1.3 

我只需要 sed 从上面的行中提取 1.3

到目前为止,我已经尝试了很多类似的东西,但显然没有效果

sed 's/[^0-9.0-9]*//')

使用您展示的示例,最简单的方法可能是。只需将 shell 变量的值作为输入打印到 awk 程序中,然后将字段分隔符设置为 - 并打印其中的最后一个字段值。

echo "$string" | awk -F'-' '{print $NF}'

第二个解决方案: 如果您在值的最后一个字段中除了版本号之外还有其他任何东西(其中 - 是字段分隔符) 然后使用 awk.

match 功能
echo "$var" | 
awk -F'-' 'match($NF,/[0-9]+(\.[0-9]+)*/){print substr($NF,RSTART,RLENGTH)}'

第三个解决方案: 使用 GNU grep 尝试以下一次。在此处使用 GNU grep\K 选项。这将匹配 - 之前的所有内容,然后提及 \K 将忘记或不会考虑打印匹配的值,并将打印所有进一步匹配的值(进一步提到正则表达式)。

echo "$var" | grep -oP '.*-\K\d+(\.\d+)*'

这应该适用于任何 grep:

s='1012-EPS-Test-OF-Something-1.3'
grep -Eo '[0-9]+(\.[0-9]+)+' <<< "$s"

1.3

这可能对你有用 (GNU sed):

sed -n 's/.*[^0-9.]//p' file

regexp 是贪婪的,吞下整行 .* 然后一次退回一个字符,直到 [^0-9.] 的第一个匹配,删除前面的部分并打印剩余部分。

您可以使用字符串操作来获取 -:

之后的最后一部分
s='1012-EPS-Test-OF-Something-1.3'
s="${s##*-}"

参见this online demo

#!/bin/bash
s='1012-EPS-Test-OF-Something-1.3'
s="${s##*-}"
echo "$s"
# => 1.3

参见10.1. Manipulating Strings

${string##substring}

    Deletes longest match of $substring from front of $string.