Portanto, tenho muitas postagens do Jekyll _posts
com metadados YAML no cabeçalho, incluindo categories
, assim:
---
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
---
Então eu sei como usar o grep para a categories
linha e mostrar n
as linhas depois de ( -An
)... mas existe uma maneira de fazer com que ela mostre todas as linhas seguintes que começam com -
, obviamente, cada postagem tem um número diferente. Talvez todas as linhas até layout
?
Responder1
A ferramenta recomendada para processamento de texto é awk
.
Experimente isto:
awk '/categories/,/layout/ { if (!/layout/) print }' your_file
Este comando imprime tudo a partir de categories
até layout
sem esta linha em si.
Saída:
categories:
- tips
- programming
- howto
- another-tag
Se você quiser apenas ter os itens entre categories
e layout
você pode simplesmente adicionar um segundo padrão à if
condição como este:
awk '/categories/,/layout/ { if (!/layout/ && !/categories/) print }' your_file
Então sua saída ficará assim:
- tips
- programming
- howto
- another-tag
Responder2
Se você puder usar pcregrep
(expressões regulares compatíveis com Perl):
pcregrep -M 'categories.*(\n-.*)*' file
ou usando a afirmação antecipada:
pcregrep -M 'categories(.|\n)*(?=layout)' file
Responder3
sed -e '/^categories:/,/^[^-]/!d;//d' yourfile
Responder4
Aqui está uma maneira de fazer isso com o awk. Ao encontrar a linha do cabeçalho, imprima-a e continue obtendo a próxima linha e imprimindo-a, desde que a próxima linha comece com -
.
awk '$0=="categories:" { do { print; getline } while (/^-/) }'