in reply to Re: Regex question
in thread Regex question
The way to do this is to define an END{} block.
With the -n or -p switch, there's another solution - Abigail's trick, the 'eskimo greeting':
perl -ne '}{ print $.' # count lines
My solution made into a one-liner
perl -ne 'BEGIN{$_=shift for$B,$A,$p}/$p/and@l=(),do{<>for 1..$A},next +;push@l,$_;print shift@l if$B<@l}{print@l' 3 5 pattern test.txt
where 3 is lines before, 5 is lines after the pattern.
Output:keep 1 keep 2 keep 3 keep 4 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 5 keep 6 keep 7 keep 8 keep 9 keep 10 keep 11 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 12 keep 13 keep 14 keep 15 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 16 keep 17 keep 18 keep 19 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 20 keep 21
keep 1 keep 2 keep 3 keep 4 keep 5 keep 6 keep 7 keep 8 keep 9 keep 10 keep 11 keep 12 keep 13 keep 14 keep 15 keep 16 keep 17 keep 18 keep 19 keep 20 keep 21
|
|---|