2017-08-07 187 views
1

我需要一个匹配[A-Za-z_0-9]*\.xml之前ERROR的正则表达式。正则表达式(grep)向后匹配

下列输入应该匹配match_me.xml

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

Lorem存有悲坐阿梅特,consetetur sadipscing elitr,SED直径nonumy eirmod tempor invidunt UT labore等dolore蚤aliquyam ERAT,sed的直径 voluptua。在维罗EOS等accusam等胡斯托二人

match_not_me.xml

多洛雷斯等EA rebum。

match_me.xml

STET clita kasd gubergren,没有海takimata圣哉EST Lorem存有悲坐阿梅德。 Lorem存有悲坐阿梅德,consetetur sadipscing elitr,SED直径nonumy eirmod tempor invidunt UT labore等dolore麦格纳

错误

aliquyam ERAT,sed的直径voluptua。在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,没有海takimata sanctus est洛雷姆ipsum dolor坐amet。

回答

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和将其重置为空白。
+0

THX。你能解释一下它是如何工作的吗? –

+0

好的,我添加了它。 – anubhava

+1

错字,应该是'p =“”'并且可以简化我认为...''p &&/ERROR/{print p; p =“”} ...' – Sundeep

0

的grepPCRE)溶液:

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

  • [\s\S]+? - 任何字符匹配“非贪心“的态度

  • \K - 忽略以前的比赛

输出:

match_me.xml