为何sed扩展正则的加号失效?如何用单条sed提取版本号
单条sed命令实现版本号提取合并
可以用单条sed命令完成需求,核心是修正正则表达式的语法问题:
方案1:使用扩展正则(-E参数)
echo "Python 3.10.2" | sed -E 's/.* ([0-9]+)\.([0-9]+)\..*/\1\2/'
执行后输出310;对于次版本是一位数的场景(比如Python 3.9.5),执行后会输出39,同样符合需求。
你之前的命令报错原因
你之前的命令存在两处语法错误:
- 启用
-E后,sed使用扩展正则表达式,分组括号()不需要加反斜杠转义,你写的\([0-9]+\)会被当成普通字符处理,导致正则语法错误; - 版本号里的小数点
.在正则中代表任意字符,必须转义成\.才能匹配实际的小数点。
方案2:不使用扩展正则(兼容旧版sed)
如果你的环境不支持-E参数,可以用基本正则的写法,此时分组括号需要转义,加号用\{1,\}替代:
echo "Python 3.10.2" | sed 's/.* \([0-9]\{1,\}\)\.\([0-9]\{1,\}\)\..*/\1\2/'
两种方案都能直接提取主版本号和次版本号并合并,无需额外调用grep。
内容的提问来源于stack exchange,提问作者Strive
相关产品推荐
相关产品推荐

