Как я могу использовать grep для извлечения двух шаблонов из одинаковых фрагментов текста фиксированной длины?

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

Section
Info1
etc etc
Info2

Я хочу быть в состоянии grep для секции и захватить Info1 а также Info2, Я пытался использовать шаблон ИЛИ, т.е. Info1\|Info2но это грешит все Info1 а также Info2 в случайном порядке. я хочу Info1 а также Info2 каждого раздела быть найдены вместе.

Все разделы имеют одинаковую длину. Там всегда фиксированное количество строк между Info1 а также Info2, Желаемый результат:

Info1
Info2
Info1
Info2
...

где подряд Info1/Info2s из того же раздела Есть идеи, как это сделать?

1 ответ

Якорь Grep

Вам не нужно чередование или трубы для примера, который вы опубликовали. Учитывая ваш корпус, следующее прекрасно работает:

$ grep '^Info' /tmp/foo
Info1
Info2
Info1
Info2

Если у вас нет линий между разделами, которые начинаются с Info тогда вам не нужно ничего более сложного. Однако, предполагая, что ваш реальный корпус более сложный и что вам может потребоваться дополнительная обработка в каждом разделе, я обращаюсь к разделам фиксированной длины ниже.

Фильтрация секций фиксированной длины с Grep

Предполагая, что каждый раздел содержит ровно 4 строки, например:

Section
Info1
etc etc
Info2

Section
Info1
etc etc
Info2

тогда вы можете использовать -A флаг, чтобы определить количество контекста после совпадения для возврата. Затем вы можете передать это в привязанное выражение, которое соответствует Info в начале любой строки. Это возвращает результаты, которые вы хотели:

$ grep -F -A3 Section /tmp/foo | grep '^Info'
Info1
Info2
Info1
Info2
Другие вопросы по тегам