关于linux:正则表达式(grep)向后匹配

Regex (grep) Backward match

我需要一个与关闭的[A-Za-z_0-9]*\.xml匹配的regex,在ERROR之前。

以下输入应与me.xml匹配

  • 应确定ERROR
  • 错误前的第一个[A-Za-z_0-9]*\.xml应该匹配。->匹配me.xml
  • Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
    eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
    voluptua. At 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

    ERROR

    aliquyam erat, sed diam voluptua. At 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.


    GREP(PCRE)解决方案:

    1
    grep -Poz 'ERROR[\s\S]+?\s\K[A-Za-z_0-9]+\.xml' <(tac file) && echo

    • tac file—文件的串联行,顺序相反。

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

    • \K—忽略以前的匹配

    输出:

    1
    match_me.xml

    您可以使用awk进行以下操作:

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

    match_me.xml
  • 当一行与我们的模式匹配时,我们将该行存储在变量p中。
  • 当设置p时,我们遇到ERROR时,我们打印p并将其重置为空白。