Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: command line perl command to get between lines with non greedy match

by LanX (Archbishop)
on Jan 17, 2020 at 22:36 UTC ( #11111557=note: print w/replies, xml ) Need Help??


in reply to command line perl command to get between lines with non greedy match

Thanks for editing! :)

> is a greedy match

That's not the accurate term, it's just a multiple match and you only want the last one.

One way to achieve this in a one-liner is not to print all the matches but to store them in an array and to only print the last match in an END{} block.

The difficulty here is to always reset the array for previous matches.

> Note this is extremely large file and can't put the whole file into a string.

In this case it might be better to go reverse and read a sliding window from the end.

But I don't know how to do this with a one-liner.

To decide this one needs to know how "large" is "extreme" ?

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

) I think I misunderstood your problem, see Re: command line perl command to get between lines with non greedy match for another approach.

  • Comment on Re: command line perl command to get between lines with non greedy match
  • Download Code

Replies are listed 'Best First'.
Re^2: command line perl command to get between lines with non greedy match
by LanX (Archbishop) on Jan 17, 2020 at 23:02 UTC
    > The difficulty here is to always reset the array for previous matches.

    Too lazy for a full example, look at this demo code in the debugger

    DB<72> map {if ($x=(/b/../d/)) { $out[$x]=$_; $last=$x }} a..e,a..e, +a..b,1..3,d..e; DB<73> x @out[1..$last] 0 'b' 1 1 2 2 3 3 4 'd' DB<74>

    $x is actually a count of the flip-flop match and will be reset 3 times.

    we keep the last max $x in $last

    you only need to END{print @out[1..$last] } in your one-liner to eject just these last lines.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

    update

    assuming PATTERN2 and PATTERN3 are similar

    >perl -ne"if ($x=(/PATTERN1/.../PATTERN?/)) { $out[$x]=$_; $last=$x; } +; END{ print @out[1..$last] }" input PATTERN1 SOME INFO TEXT4 TEXT5 TEXT6 PATTERN3 SOME INFO C:\tmp\files>

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11111557]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2020-02-29 04:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What numbers are you going to focus on primarily in 2020?










    Results (128 votes). Check out past polls.

    Notices?