объединение игнорирования grep и совпадений

Я хотел бы grep-файл найти все экземпляры текста fn1 которые не имеют словосочетания перед ним, и распечатать четыре строки до и после совпадений (даже если в окружающих линиях есть слово- call в них) , Я пытался

 grep -A 4 -B 4 '[^call].+fn1' 

но он не получает никаких совпадений (предположительно из-за [^call] ). Я не могу просто использовать -v и передавать это на другой grep или наоборот, потому что хочу видеть окружающие строки текста. Думаю, я мог бы использовать -v на call , pipe, чтобы grep fn1 а затем grep fn1 эти строки в другой экземпляр grep, который соответствует целым строкам с контекстом, но это кажется уродливым и может быть очень медленным, если есть много совпадений.

Кажется, это должно быть просто, но я не уверен. Любая помощь?

РЕДАКТИРОВАТЬ:

Пример данных

 main code main code more main code call fn1(ii, jj) even more main code call fn2 still more main code function fn1 call fn3 fn1 code more fn1 code 

Я бы хотел, чтобы grep retutn

 call fn2 still more main code function fn1 call fn3 fn1 code more fn1 code 

Я хочу, чтобы он показывал мне все экземпляры, где используется fn1, кроме тех случаев, когда он вызывается, и я не хочу пропускать другие функции, вызываемые в контексте.

  • Фильтрованный список файлов, содержащих строку
  • Сколько текста grep / egrep потребляет каждый раз?
  • Egrep назад ссылка не работает
  • Как обратные ссылки замедляют поиск регулярных выражений?
  • Как использовать не жадное регулярное выражение в grep?
  • Найти файлы, содержащие одну строку, но не другую
  • Скрипт для быстрого тестирования всех клавиш клавиатуры
  • Греп остальной линии ... после матча
  • One Solution collect form web for “объединение игнорирования grep и совпадений”

    Отменить регулярные выражения непросто. Вы можете использовать отрицательные 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 чтобы получить -A4 -B4 .

    Linux и Unix - лучшая ОС в мире.