如何使用sed表达式删除字符串第三个点之后的所有内容
问题说明
需要在bash环境下截断版本号字符串,从输入2.0.0.1603182415中提取得到结果2.0.0。
原尝试命令无法返回正确结果:
echo '2.0.0.1603182415' | sed 's/\..*//3'
错误原因
sed替换语法s/匹配规则/替换内容/标记位里,末尾的数字标记是指「替换第N个匹配到的片段」,但你写的匹配规则\..*是贪婪匹配:从第一个.开始会直接匹配到字符串末尾的所有内容,整个字符串只会存在1个匹配项,根本不存在第3个匹配目标,所以命令不会做任何替换,直接输出原字符串。
可行实现方案
以下几种方案都可以在bash环境下直接运行得到预期结果,按场景选就行:
- 方案1:sed正则匹配(兼容性最好)
用扩展正则捕获前三段版本号,丢弃后面所有内容,不管后续跟多少段版本后缀都能稳定取到前三位:
echo '2.0.0.1603182415' | sed -E 's/^([0-9]+\.[0-9]+\.[0-9]+)\..*/\1/'
- 方案2:awk按分隔符切分(逻辑最直观)
以.作为字段分隔符,直接打印前3个字段并用.拼接,不需要写复杂正则:
echo '2.0.0.1603182415' | awk -F '.' '{print $1"."$2"."$3}'
- 方案3:bash内置语法(无外部命令依赖,执行效率最高)
如果版本号已经存储在shell变量中,不需要调用sed、awk等外部命令,直接用bash内置的字符串处理即可,以下写法不管后面跟多少段后缀,都能稳定取前3段:
ver="2.0.0.1603182415" IFS='.' read -r v1 v2 v3 _ <<< "$ver" echo "$v1.$v2.$v3"
如果你的版本号固定是4段、只需要删除最后一段,还可以用更短的内置参数展开写法:
ver="2.0.0.1603182415" echo "${ver%.*}"
注意:这个短写法只适用于版本号总段数固定为4的场景,如果后续段数增加(比如出现5段、6段版本号),它只会删除最后一段,无法保证返回前三段结果。
内容的提问来源于stack exchange,提问作者FeiLong001
相关产品推荐
相关产品推荐

