【问题标题】:Exclude wildcard containing string 'x'排除包含字符串“x”的通配符
【发布时间】:2017-12-23 16:25:33
【问题描述】:

有没有办法修改egrep -rha 'part1.*part2' 以添加类似:“如果.* 包含(不一定等于)string_x 那么模式不匹配”​​?问题是string_x 存在于每一行中,所以我不能-v 它。在模式之前或之后有这个字符串是可以的,只是不要在它的中间。

我假设将.*not string_x 放在它们之间可以完成工作,但这需要很长时间,而且我有时会使用.{n,m} 通配符,在这种情况下,它会加倍所需的通配符长度。每次在第 2 部分之前遇到string_x 时可能会出现某种搜索终止?

【问题讨论】:

  • 您可以随时通过管道传递另一个 grep:grep 'part1.*part2' | grep -v 'part1.*string_x.*part2'
  • 这不是永远吗? grep -v 是否仅在第一个 grep 找到匹配项或所有 toime 时发生?
  • 为什么永远?它可能是最有效的。第二个grep 只会作用于第一个grep输出。顺便说一句,没有办法像你提到的那样指定not string_x
  • 因为每个通配符似乎都将搜索时间加倍,大约为 2 分钟,而没有任何通配符。肯定会测试它。如果我不排除字符串而是排除单个字符会更容易吗?
  • 如果你想排除一个字符,它可能会更快:例如如果你想排除part1part2之间的字符c,你可以使用:@987654338 @.

标签: bash grep wildcard


【解决方案1】:

忘记你听说过-r 或任何其他让grep 查找文件的选项。有一个非常好的工具可以查找名称非常明显的文件 - find。保留 grep 以了解 g/re/p 的优势所在。我无法想象当 GNU 家伙决定提供 grep 选项来查找文件时他们在抽什么烟,但希望他们现在没有计划添加选项以对文件进行排序或从网站提取内容或打印流程数据或做任何其他事情现有的工具做得很好!

在这种情况下,您需要的不仅仅是 g/re/p,因此您应该使用 awk:

awk '/part1.*part2/ && !/part1.*string_x.*part2/'

所以完整的脚本会是这样的(未经测试,因为没有提供示例输入/输出):

find . -type f -exec awk '/part1.*part2/ && !/part1.*string_x.*part2/' {} +

【讨论】:

  • “当 GNU 家伙决定提供 grep 选项来查找文件时,我无法想象他们在抽什么烟”。 +1。主要违反 Unix 哲学。
  • 首先,谢谢你,这很好用。尽管此脚本比 grep 花费的时间长 2-3 倍(至少在没有通配符的搜索方面)。嗯,我要学点东西。
  • 不客气。 wrt this script takes 2-3 times longer than grep - awk 应该比 2 个 greps + 一个管道快,所以我觉得这很难相信,所以请准确地发布您正在比较的 2 个脚本,因为您可能在谈论 1 个 awk 与 1 个grep 或 1 find+awk vs 1 grep 或 1 awk vs 2 greps 并且您可以在每种情况下使用不同的正则表达式或其他东西,最好确切地知道产生该结果的比较是什么,因为我怀疑它是不是苹果对苹果。
猜你喜欢
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2019-04-24
  • 1970-01-01
  • 2016-11-07
  • 2018-04-02
  • 1970-01-01
相关资源
最近更新 更多