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

  • bash - почему \ x0d \ x20 стирает строку
  • Какое регулярное выражение в grep ищет строки из трех одинаковых букв подряд?
  • Как найти текст, скопировать его и вставить в следующую строку в файле?
  • Труба к моему собственному сценарию
  • Инструмент, подобный Grep, для отображения определенной области текста относительно шаблона
  • grep фильтрует все линии плюс один перед каждым нажатием
  • Grep строка из того же файла в нескольких файлах .tar.gz
  • 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 .

    Interesting Posts

    Есть ли инструмент linux vfs, который позволяет связывать каталог в другом месте (например, mount -bind) в пространстве пользователя?

    Как установить emacs 24.3 на Fedora 17 с помощью yum?

    Как я могу создать «базу» для других псевдонимов для ссылки на каталоги базы данных cd base / x?

    RAID 1 + 0, Solaris 10

    Почему официальные изображения Docker используют операционную систему

    Менеджер графического архива, который использует / tmp

    Какой «правильный» формат для переменной среды HTTP_PROXY? Колпаки или колпачки?

    Экран – наследует среду текущего окна

    Как увеличить размер буфера прокрутки для tty

    Выход Grep между узлами XML «Шаблон в наборе основных узлов»

    Экран Escape Windows (удалить целую строку) в Bash

    Как автозаполнение проигнорировать конкретное завершение

    Веб-интерфейс для поиска / grep / ack

    монтировать через дополнение fuseiso9660; 1 к именам файлов

    tell dnf как ссылаться на установленную библиотеку

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