Найти все строки, которые следуют шаблону и начинаются с символа

Найти все строки, которые следуют шаблону и начинаются с символа

Итак, у меня есть много записей Jekyll _postsс метаданными YAML в заголовке, включая categories, например, такую:

---
excerpt: "I am an excerpt"
categories:
- tips
- programming
- howto
- another-tag
layout: blog
title: I am a Page Title
created: 1267026549
permalink: blog/27-05-2017/clean-url-goes-here
---

Итак, я знаю, как выполнить grep для categoriesстроки и показать nстроки после ( -An)... но есть ли способ заставить его показать все последующие строки, которые начинаются с -, поскольку, очевидно, у каждого поста свой номер. Может быть, все строки до layout?

решение1

Рекомендуемый инструмент для обработки текста — awk.

Попробуй это:

awk '/categories/,/layout/ { if (!/layout/) print }' your_file

Эта команда выводит все, начиная с categoriesдо, layoutза исключением этой строки.

Выход:

categories:
- tips
- programming
- howto
- another-tag

Если вам нужны только элементы между categoriesи , layoutвы можете просто добавить второй шаблон к ifусловию следующим образом:

awk '/categories/,/layout/ { if (!/layout/ && !/categories/) print }' your_file

Тогда ваш вывод будет выглядеть так:

- tips
- programming
- howto
- another-tag

решение2

Если вы можете использовать pcregrep(совместимые с Perl регулярные выражения):

pcregrep -M 'categories.*(\n-.*)*' file

или с использованием утверждения о просмотре вперед:

pcregrep -M 'categories(.|\n)*(?=layout)' file

решение3

sed -e '/^categories:/,/^[^-]/!d;//d' yourfile

решение4

Вот способ сделать это с помощью awk. Когда вы найдете строку заголовка, выведите ее на печать и продолжайте получать следующую строку и выводить ее, пока следующая строка не начнется с -.

awk '$0=="categories:" { do { print; getline } while (/^-/) }'

Связанный контент