grep 匹配模式的多个字符串

grep 匹配模式的多个字符串

我有一个不同版本的 deb 目录列表。我的要求是找到具有匹配版本的包。

这是我到目前为止所尝试的

ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'

上面的命令只给我 Package1 的 o/p。

尝试了所有的选项从这里。但它们都没有帮助。

答案1

第一的,关于不解析的常规警告ls。也就是说,假设您的文件命名合理,您可以这样做:

ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'

这里唯一的区别是,我避免使用第一个 grep,这是不必要的,因为你可以直接将 glob 模式传递给ls。然后,egrep我使用已弃用的 ,grep -E它是同样的东西。

但是,这与您的命令本质上相同。如果不起作用,则说明您没有匹配的文件:

$ ls debs/
1.1.16.Package3  Package1.1.1.160  Package1.1.2.16  Package2.1.1.16
$ ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16

正如预期的那样,这显示了两个匹配的文件。这正是您的命令打印的内容:

$ ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16

请注意,由于模式中的package3是小写(p而不是P) ,因此不会显示grep该文件。1.1.16.Package3

答案2

有一种方法可以在不削减ls输出的情况下做到这一点。

version=1.1.16
for package in debs/*Package1*${version}* \
               debs/*Package2*${version}* \
               debs/*package3*${version}*;
do
  action with $package;
done

这样 shell 将扩展 glob 并迭代匹配的文件。如果没有文件与提供的模式匹配,脚本将简单地跳过循环而不会出现任何错误。

或者尝试find

version=1.1.16
find debs/ \( -name "*Package1*${version}*" -o -name "*Package2*${version}*" -o -name "*package3*${version}*" \)

相关内容