объединение игнорирования 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-шаблоны из файла1 в столбец file2
  • Диапазон значений grep (/ sed / awk)
  • Регулярное выражение ^ $ не работает в UNIX, используя команду grep
  • Как получить несколько строк из файла с помощью регулярных выражений?
  • Получить серийный номер из Показать инвентарь
  • Grep огромное количество шаблонов из огромного файла
  • grep-файлы из списка
  • Как правильно использовать / usr / xpg4 / bin / grep -F
  • 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 .

    Interesting Posts

    Ядро Linux: значение source-tree, in-tree и out-of-tree

    как подсчитать длину массива, определенного в bash?

    Восстановить файлы из образа резервного копирования partclone без генерации большого файла необработанного диска? (например, файл Tib для Acronis)?

    Символическая ссылка, собирающая неправильный каталог

    Ctrl + c и Ctrl + z для прерывания / приостановки заданий

    Определение разницы в датах в формате «% Y% m% d% H% M% S»

    Как преобразовать prc в pdf в Ubuntu cli?

    Мусорные символы при использовании последовательного соединения через SSH-соединение с миникомпьютом / экраном

    tc на мостовом порту

    Чтение содержимого файла и разбиение с помощью ksh

    Есть ли более элегантный способ подсчета слов и присвоение этому числу переменных?

    Как я могу исправить проблему, когда приложение «Установка и удаление программ» никогда не запрашивает мой пароль?

    Как уменьшить количество исполнений с помощью xargs -I

    Зеркалирование портов в Fedora?

    Путаница о sed и '>'

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