总结:
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.].*//'