使用 sed 或 awk 删除第一个非数字字符后的所有字符

使用 sed 或 awk 删除第一个非数字字符后的所有字符

总结:

sed我怎样才能创建使用或awk将删除的表达式全部第一个字符之后的字符(包括第一个字符)不是可以是数字(即[0-9])或句点(.)。我发现以前的 SE 帖子描述了如何删除非数字字符并保留全部数字字符(用于例子),但就我而言,我可能想要根据数字字符出现的位置删除一些数字字符。

用例:

我正在编写一个 shell 脚本,用于根据最低要求列表检查多个软件包的版本号。我有一个函数可以执行此操作,但版本号不能包含除数字和句点之外的字符。

但有时版本号包含非数字字符,我需要将其删除。例如,在我的计算机上,bash --version结果为

GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
...

5.0.3(1)-release我可以使用head和轻松隔离部分cut,但我想将其缩减为5.0.3。在这个特定示例中,这很容易做到,但我正在寻找一个可以在各种不同情况下执行此操作的通用表达式。

4.6.0.225-235f --> 4.5.0.225
5.28.1'; --> 5.28.1
4.19.0-9-cloud-amd64 --> 4.19.0-9

ETC

答案1

sed 's/[^0123456789.].*//'

[0123456789.]会匹配数字或句点。^inside[]会否定整个内容,因此[^0123456789.]在我们的命令中匹配“第一个既不是数字也不是句点的字符”。然后.*匹配“行中之后的所有字符”。该命令将匹配的片段替换为空字符串。

我没有使用,[0-9]因为它取决于语言环境。请参阅这个答案[0-9][[:digit:]]之间的区别\d 。但如果你知道你真的想要,[0-9]那么命令将是

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

相关内容