我正在尝试清理包含包的列表。我希望删除软件包修订版本,仅保留软件包名称。
我看到每个包都有这样的命名约定: 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/-/'
它毫不费力地删除了最后两个“-”分隔的列,如果有人知道如何做得更好,我很想知道。