Отрицать регулярные выражения нелегко. Вы можете использовать отрицательные lookbehinds:
$ grep -C4 -P '(?<!call).*fn1' test.txt
5-even more main code
6-call fn2
7-still more main code
8-
9:function fn1
10-call fn3
11-fn1 code
12-more fn1 code
Этот grep
использует регулярные выражения в Perl-стиле (-P
) для поиска любого экземпляра fun
, которому не предшествует вызов call
. И вы можете объединить -A4 -B4
, чтобы получить -C4
.