Как я могу использовать grep для извлечения двух шаблонов из одинаковых фрагментов текста фиксированной длины?
Я пытаюсь извлечь информацию из файла с помощью grep и установить связь между связанными событиями. Например, мой файл может содержать следующий повторяющийся шаблон:
Section
Info1
etc etc
Info2
Я хочу быть в состоянии grep для секции и захватить Info1
а также Info2
, Я пытался использовать шаблон ИЛИ, т.е. Info1\|Info2
но это грешит все Info1
а также Info2
в случайном порядке. я хочу Info1
а также Info2
каждого раздела быть найдены вместе.
Все разделы имеют одинаковую длину. Там всегда фиксированное количество строк между Info1
а также Info2
, Желаемый результат:
Info1
Info2
Info1
Info2
...
где подряд Info1
/Info2
s из того же раздела Есть идеи, как это сделать?
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