Найдите точное совпадение идентификатора, который всегда находится на одной строке ниже шаблона через grep

Я хотел бы знать код для grep для проверки двух совпадений один за другим. Например, у меня есть следующий текст из одного из файлов поиска:

 @<TRIPOS>MOLECULE ← pattern 1532 ← ID 17 17 SMALL NO_CHARGES 

Мне нужно найти точное соответствие идентификатора, который всегда находится на одной строке ниже шаблона, а затем получить имя файла, из которого был найден ID.

Я использовал следующую команду:

 grep -Pzo '@<TRIPOS>MOLECULE'(?:.*\n)*?\K1532' filename 

но я получил файлы, содержащие 1532, а также 153284. Мне нужен код для точного совпадения идентификаторов.

  • Узнайте, на какой строке в текстовом файле соответствует слово
  • Сортировка по одному столбцу, затем
  • проверить переменную в файле для согласованности в приращении
  • как бороться с сложной иерархией?
  • Показывать строки, соответствующие шаблону и 4 строки перед каждым
  • Проблема с небольшим сценарием bash
  • linux + соответствует IP ADDRESS с 3 октетами или с 4 октетами
  • Как обмениваться словами в имени файла с помощью оболочки?
  • One Solution collect form web for “Найдите точное совпадение идентификатора, который всегда находится на одной строке ниже шаблона через grep”

    Ваша модель ищет 1532 но ничего не говорит о том, что происходит потом:

     $ printf '1532\n15321\n1532foo\n' | grep -o '1532' 1532 1532 1532 

    В зависимости от того, что вы хотите сделать, вы можете ограничить свой шаблон только совпадением перед новой строкой:

     grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\n' filename 

    Или, если может быть пробел после номера до конца строки:

     grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\s*\n' filename 

    В качестве альтернативы, если вы можете иметь другие вещи в одной строке, используйте \b чтобы убедиться, что число встречается до границы слова:

     grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\b' filename 
    Linux и Unix - лучшая ОС в мире.