Encontre todas as linhas que seguem um padrão e começam com um caractere

Encontre todas as linhas que seguem um padrão e começam com um caractere

Portanto, tenho muitas postagens do Jekyll _postscom 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 categorieslinha e mostrar nas 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 categoriesaté layoutsem esta linha em si.

Saída:

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

Se você quiser apenas ter os itens entre categoriese layoutvocê pode simplesmente adicionar um segundo padrão à ifcondiçã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 (/^-/) }'

informação relacionada