sed 搜索并显示匹配模式,删除其余内容

sed 搜索并显示匹配模式,删除其余内容

我正在尝试清理包含包的列表。我希望删除软件包修订版本,仅保留软件包名称。

我看到每个包都有这样的命名约定: package-name-majorver-minorver 等: openssl-1.0.1e-57.0.5.el6 。我只想要 openssl,而不是 -1.0.1e-57.0.5.el6

到目前为止我已经有了这个sed 's/^.*-//',但这显然不起作用。

答案1

如果包名称始终附加两个版本号部分,并用连字符分隔,并且版本部分从不包含连字符,则可以使用此命令

sed 's/-[^-]*-[^-]*$//'

这将删除行末尾的两个连字符 ( $),每个连字符后跟 0 个或多个非连字符。它也将更改为foo-bar-baz--例如foo-bar-baz

答案2

如果包名称不包含-,则这应该有效:

sed -r 's/([^-]+).*/\1/' 

答案3

好吧,我知道这不是最好的解决方案,但我发现了这个https://stackoverflow.com/a/51153277/5227747,所以解决方案是

cat file | sed 's/ // ; s/-/\t/' | rev | cut -f 3- | rev | sed 's/\t/-/'

它毫不费力地删除了最后两个“-”分隔的列,如果有人知道如何做得更好,我很想知道。

相关内容