Итак, у меня есть много записей 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 (/^-/) }'