【问题标题】:Limiting results to ±5 lines将结果限制为 ±5 行
【发布时间】:2014-03-06 23:01:13
【问题描述】:

我正在使用以下正则表达式在同一文件中查找 foobar 的实例,这些实例可能位于不同的行:

$ pcregrep --color -Mi '(foo[\d\D]*bar)?(bar[\d\D]*foo)?' *

如何将其限制为在 ±5 行上显示单词?

我熟悉 {0,5} 量词,但我真的不知道如何设计查询。我在想像这样丑陋的东西,但我似乎无法正确地设计它:

[\d\D](\n[\d\D]){0,5}

上面返回如下结果:

pcregrep: Error in command-line regex at offset 26: nothing to repeat

【问题讨论】:

  • 有什么理由使用[\d\D]而不是.
  • 试试foo([^\n]*\n?){0,4}bar(未经测试)。这应该会找到foobar,它们之间最多有4 个换行符和任意数量的其他字符。您应该能够轻松地将其调整为 bar...foo
  • 其实应该是foo([^\n]*\n?){0,4}[^\n]*bar,如果bar不能保证在行首。
  • @n.st:我在使用. 时遇到问题,请参阅this related question。谢谢!

标签: regex linux bash grep


【解决方案1】:

以下可能对您有用:

pcregrep -M '(foo.*(.*\n){0,4}.*?bar)?(bar.*(.*\n){0,4}.*?foo)?' filename

这将找到包含foobar 的行,彼此相距5 行。

编辑:根据 cmets 添加替代方案:

pcregrep -M '(foo(\n*.*?){0,4}bar)?(bar(\n*.*?){0,4}foo)?' filename

【讨论】:

  • 谢谢,不过这是匹配some spurious matches,比如b那一行。
  • @dotancohen 输出有什么虚假?除非我遗漏了什么,否则它似乎符合预期。正在生成带有b 的行,因为它位于foo1 foo 2 bar 3 之间。对于另一种情况也是如此。你期待什么?
  • 我认为我正在寻找的术语是“不贪婪”。第 3 行的 bar 应该“关闭”第 1 行的 foo
  • 非常感谢 devnull!我仍在调整,但我已经足够接近在真实数据上做我需要的事情了。如果您有任何关于正则表达式语法的文档来源,我会喜欢一个链接。我发现 . 没有按我的预期工作,还有一些我找不到文档的奇怪现象。
【解决方案2】:

我没有pcregrep,但这适用于我的(符合 pcre 的)测试:(foo(?:.*\n){0,5}bar)

【讨论】:

猜你喜欢
  • 2020-12-17
  • 2018-01-02
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2016-03-22
  • 2018-07-08
相关资源
最近更新 更多