![如何使用“sed”删除软件包列表的版本信息?](https://linux22.com/image/987197/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E2%80%9Csed%E2%80%9D%E5%88%A0%E9%99%A4%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%88%97%E8%A1%A8%E7%9A%84%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF%EF%BC%9F.png)
例如搜索的结果是列表 > /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