2017-08-07 249 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