首页 > 解决方案 > 发现很难使用 sed 从字符串中提取数字

问题描述

我正在尝试使用 sed 将版本信息提取为字符串,如下所示

echo "A10.1.1-Vers8" | sed -n "s/^A\([0-9]+\)\.\([0-9]\)\.[0-9]+-.*/\1/p"

我想在“A”之后提取“10”。但是上面的表达式没有给出预期的信息。有人可以解释一下为什么这个声明不起作用吗?

我尝试了上述命令并更改了选项 os sed 但没有任何效果。我认为这是一些语法错误

echo "A10.1.1-Vers10" | sed -n "s/^X\([0-9]+\)\.\([0-9]\)\.[0-9]+-.*/\1/p"

预期结果是 '10' 实际上结果是无

标签: sed

解决方案


$ echo "A10.1.1-Vers8" | sed -r 's/^A([[:digit:]]+)\.(.*)$/\1/g'
10

搜索以 A ( ^A) 开头的字符串,后跟多个数字(我使用的是POSIX 字符类 [[:digit:]]+),这些数字被捕获在一个组()中,然后是文字点\.,然后是其他所有内容(.*)$

最后,用 Captured Group content 替换整个内容\1

在 GNU sed 中,-r添加了一些语法糖,在手册页中,它被称为--regexp-extended


推荐阅读