正则表达式(grep)向后匹配

时间:2017-08-07 07:16:45

标签: regex linux grep

我需要一个与之前关联的[A-Za-z_0-9]*\.xml 匹配的正则表达式 ERROR

以下输入应与 match_me.xml

匹配
  1. ERROR应该确定。
  2. 应该匹配ERROR之前的第一个[A-Za-z_0-9]*\.xml。 - >的 match_me.xml
  3.   

    Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy   eirmod tempor invidunt ut labore et dolore magna aliquyam erat,sed diam   voluptua。在vero eos et accusam et justo duo

         

    match_not_me.xml

         

    dolores et ea rebum。

         

    match_me.xml

         

    Stet clita kasd gubergren,no sea takimata sanctus est Lorem ipsum dolor sit amet。 Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna

         

    错误

         

    aliquyam erat,sed diam voluptua。在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,no sea takimata sanctus est Lorem ipsum dolor sit amet。

2 个答案:

答案 0 :(得分:1)

您可以使用awk

awk 'p && /ERROR/{print p; p==""} /^[A-Za-z_0-9]*\.xml$/{p=$0}' file

match_me.xml
  1. 当一行符合我们的模式时,我们会将该行存储在变量p
  2. 设置p后我们遇到ERROR,我们会打印p并将其重置为空白。

答案 1 :(得分:1)

grep PCRE )解决方案:

grep -Poz 'ERROR[\s\S]+?\s\K[A-Za-z_0-9]+\.xml' <(tac file) && echo
  • tac file - 以相反的顺序连接文件的行

  • [\s\S]+? - 以“非贪婪”的方式匹配任何字符

  • \K - 忽略上一场比赛

输出:

match_me.xml