Two further comments:
Grep gives no meaning to the -A/-B/-C flags when they are used together
with the -o flag (and prints a warning when they are used together).
Both the manual and the man page indicate that "a warning is given" when
these options are used together, but what actually happens is that a group
separator is printed at apparently random places.
I suggest to give them a specific meaning when the -o flag is used,
namely to print NUM _characters_ of trailing/leading/output context
around the match.
Currently this behavior can be obtained with "grep -oE
'.{0,A}expose_frame.{0,B}'", where A and B are the number of leading and
trailing context characters, but it is not efficient, and can become
very inefficient for "large" values of A and B (say, 40).
Of course I meant "grep -oE '.{0,A}PATTERN.{0,B}'.
The "very inefficient" case happens in particular for very long lines:
for i in $(seq 1 10)
do
printf %100000s | tr ' ' 'a'
printf foobar
printf %100000s | tr ' ' 'a'
done | grep -oE '.{0,40}foobar.{0,40}'