объединение игнорирования 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, кроме тех случаев, когда он вызывается, и я не хочу пропускать другие функции, вызываемые в контексте.

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 .

  • Индивидуальная сортировка и удаление двойных кавычек объединяются путем подчеркивания нескольких столбцов из файла с разделителями табуляции
  • Может ли grep выводить только указанные группы, которые соответствуют?
  • Почему grep не работает?
  • Выход grep cdrecord
  • Поиск шаблона регулярного выражения для чередующегося символьного случая
  • Grep ищет файлы, которые не существуют
  • Изоляция строки в / etc / passwd, которая содержит «строку», используя grep
  • Как я могу отфильтровать эти «Permission denied» из вывода вывода?
  • Как grep «a» и «aa» после числа?
  • grep не работает в цикле for по списку
  • Регулярное выражение grep, чтобы избежать совпадения точки с запятой в конце
  • Использование grep с символической ссылкой
  • Linux и Unix - лучшая ОС в мире.