Search code examples
linuxgreppcregrep

How to show only first match in pcregrep?


I have xml in log-files, that looks like:

<ServiceRs>
1
</ServiceRs>
text text text
<ServiceRs>
2
</ServiceRs>
text

So, i need to cut this XML from log file and i'm trying to do this with:

pcregrep -M '<ServiceRs>(\n|.)*</ServiceRs>'

But after this i didn't get two ServiceRs xml's, i got this:

<ServiceRs>
1
</ServiceRs>
text text text
<ServiceRs>
2
</ServiceRs>

I know, that i can modify pattern - (\n|.)* -> (\n|.){0, n), but i really don't know how many lines will be in xml.


Solution

  • Can you try

    pcregrep -M '<ServiceRs>(\n|.)*?</ServiceRs>'

    ? is for lazy match

    It only matches the content between the <ServiceRs> and </ServiceRs> and excludes the rest text text...s

    Ref: https://regexr.com/3h1ug