Wally Hartshorn has asked for the wisdom of the Perl Monks concerning the following question:

Problem: Search a file for all lines beginning with "0", then in each case delete those lines and the next 7 lines (which can begin with anything).

Bonus Problem: Do the same thing using shell commands (e.g. sed) instead of Perl.

Solution: I don't know; that's why I'm asking.

Wally Hartshorn

Replies are listed 'Best First'.
Re: Matching Multiple Lines
by Kanji (Parson) on Jan 02, 2003 at 21:48 UTC
    perl -ni.bak -e 'if ( /^0/ ) { for ( 1..7 ) { scalar <> unless eof } } else { print }' file

    ... but that doesn't handle cases where the 7 lines following a 0-prefixed line contain another 0-line (ie, should it the 'next 7' count reset?)

        --k.


A Clarification
by Wally Hartshorn (Hermit) on Jan 02, 2003 at 22:44 UTC

    I've received a few downvotes on the original post, so I think I should step in here and clarify that this is not a homework problem. :-) It's actual work-related stuff.

    I know that it can be done using a for() loop (thanks, though), but it seems like there ought to be a way to do it using just a regex. (Whoops! I didn't specify that in the problem. Doh! Okay, bad problem spec on my part.)

    I'm thinking I could just specify "\n" 7 times in the regex, but the "0" has to be at the start of the line. In other words, it must follow a "\n" -- unless it is at the start of the file. That part has me stumped. I guess I could prepend a "\n" onto the start of the file, then remove it after I'm done, but that feels ... icky.

    Wally Hartshorn

      perl -0777 -pi.bak -e 's/^0(.*\n){1,8}//mg' file

      Sure it's a lot more compact, but it suffers the same problem as my non-regex solution, is going to suck majorly for large files, and is (IMHO) less obvious about what it's actually doing, especially to those unfamiliar with Perl (YMMV).

          --k.

      Update: Oops, meant -0777 not -00.


        Very good, Kanji! That does exactly what I want! Speed isn't really an issue, and it's a one-time task. The file is several thousand lines long, and doing it by hand just didn't appeal. :-)

        This will be a great help. Thanks!

        Wally Hartshorn