如何使用“sed”删除软件包列表的版本信息?

如何使用“sed”删除软件包列表的版本信息?

例如搜索的结果是列表 > /tmp/lista.txt:

vlc-2.2.1-195.1.x86_64
pidgin-2.10.11-4.3.x86_64
qmmp-1.0.5-78.1.x86_64
spotify-client-0.9.17.8.gd06432d.31-1.x86_64

我在用着:

cat /tmp/lista.txt | sed 's/[^a-z]*//g'

但我想要的结果是:

vlc 
pidgin
qmmp
spotify-client

答案1

我认为从实际角度来说这是不可能的。用你的列表是不可能做到的。

切断数字的问题,或者只是选择文本,或者任何版本的扭结,你想要参与,连字符和数字是包中完全有效的字符名称。运行dpkg -l | awk '$2~/-[0-9]/'。我在我的 14.04 桌面上看到大约 622 个这样的包。不,这些不是完整的版本号。

让我们看一些openjdk包:

openjdk-6-jre:amd64             6b37-1.13.9-1ubuntu0.14.04.1
openjdk-6-jre-headless:amd64    6b37-1.13.9-1ubuntu0.14.04.1
openjdk-6-jre-lib               6b37-1.13.9-1ubuntu0.14.04.1
openjdk-7-jdk:amd64             7u91-2.6.3-0ubuntu0.14.04.1
openjdk-7-jre:amd64             7u91-2.6.3-0ubuntu0.14.04.1
openjdk-7-jre-headless:amd64    7u91-2.6.3-0ubuntu0.14.04.1
openjdk-7-jre-lib               7u91-2.6.3-0ubuntu0.14.04.1

我假设如果这些在你的列表中,它们将显示为:

openjdk-6-jre:amd64-6b37-1.13.9-1ubuntu0.14.04.1
openjdk-6-jre-headless:amd64-6b37-1.13.9-1ubuntu0.14.04.1
openjdk-6-jre-lib-6b37-1.13.9-1ubuntu0.14.04.1
openjdk-7-jdk:amd64-7u91-2.6.3-0ubuntu0.14.04.1
openjdk-7-jre:amd64-7u91-2.6.3-0ubuntu0.14.04.1
openjdk-7-jre-headless:amd64-7u91-2.6.3-0ubuntu0.14.04.1
openjdk-7-jre-lib-7u91-2.6.3-0ubuntu0.14.04.1

现在你也许明白了为什么这些很难提取。如果你删除数字以外的任何内容,你最终将无法区分几种类型的包裹。

我的建议是获取一个更好的列表,其中包含包名称中不允许使用的正确分隔符。空格、逗号、制表符等。

答案2

您可以匹配一个连字符和一个数字,然后替换该数字及其后的所有内容

$ sed 's/-[0-9].*//' lista.txt 
vlc
pidgin
qmmp
spotify-client

相关内容