rahuls36 Asked: 2019-12-27 02:28:08 +0800 CST2019-12-27 02:28:08 +0800 CST 2019-12-27 02:28:08 +0800 CST grep 匹配模式的多个字符串 772 我有一个不同版本的 debs 目录列表。我的要求是找到匹配版本的包。 这是我到目前为止所尝试的 ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3' 上面的这个命令只给了我 Package1 的 o/p。 从这里尝试了所有选项。但它们都没有帮助。 linux grep 2 个回答 Voted Best Answer terdon 2019-12-27T03:13:28+08:002019-12-27T03:13:28+08:00 首先,关于不解析的常规警告ls。也就是说,假设您的文件命名合理,您可以这样做: ls debs/*1.1.16* | grep -E 'Package1|Package2|package3' 这里唯一的区别是我避免使用第一个 grep,因为您可以直接将 glob 模式传递给ls. egrep然后,我使用的不是 deprecated ,而是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。 rush 2019-12-27T03:43:59+08:002019-12-27T03:43:59+08:00 有一种方法可以在不匹配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}*" \)
首先,关于不解析的常规警告
ls
。也就是说,假设您的文件命名合理,您可以这样做:这里唯一的区别是我避免使用第一个 grep,因为您可以直接将 glob 模式传递给
ls
.egrep
然后,我使用的不是 deprecated ,而是grep -E
相同的东西。但是,这与您的命令基本相同。如果它不起作用,那么您没有匹配的文件:
正如预期的那样,这显示了两个匹配的文件。这正是您的命令将打印的内容:
请注意,由于模式中的
package3
是小写(p
而不是P
),因此不会显示grep
该文件1.1.16.Package3
。有一种方法可以在不匹配
ls
输出的情况下做到这一点。这样,shell 将扩展 glob 并遍历匹配的文件。如果没有文件与提供的模式匹配,脚本将简单地跳过循环而不会出现任何错误。
或尝试
find
: