How can I print a matching line, one line immediately above it and one line immediately below?

后端 未结 8 1054
你的背包
你的背包 2020-12-16 07:23

From a related question asked by Bi, I\'ve learnt how to print a matching line together with the line immediately below it. The code looks really simple:

#!p         


        
8条回答
  •  执笔经年
    2020-12-16 08:12

    Given the following input file:

    (1:first) Yes, this one.
    (2) This one as well (XXX).
    (3) And this one.
    Not this one.
    Not this one.
    Not this one.
    (4) Yes, this one.
    (5) This one as well (XXX).
    (6) AND this one as well (XXX).
    (7:last) And this one.
    Not this one.
    

    this little snippet:

    open(FH, ") {
        $last_line = $this_line;
        $this_line = $_;
        if ($this_line =~ /XXX/) {
            print $last_line if (!$do_next);
            print $this_line;
            $do_next = 1;
        } else {
            print $this_line if ($do_next);
            $last_line = "";
            $do_next = 0;
        }
    }
    close (FH);
    

    produces the following, which is what I think you were after:

    (1:first) Yes, this one.
    (2) This one as well (XXX).
    (3) And this one.
    (4) Yes, this one.
    (5) This one as well (XXX).
    (6) AND this one as well (XXX).
    (7:last) And this one.
    

    It basically works by remembering the last line read and, when it finds the pattern, it outputs it and the pattern line. Then it continues to output pattern lines plus one more (with the $do_next variable).

    There's also a little bit of trickery in there to ensure no line is printed twice.

提交回复
热议问题