Encontre todas as linhas que seguem um padrão e comece com um caractere

3

Por isso, tenho muitas postagens de Jekyll em _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 grep para a linha categories e mostrar n linhas depois ( -An ) ... mas existe uma maneira de mostrar todas as linhas seguintes que começam com - como , obviamente, cada post tem um número diferente. Talvez todas as linhas até layout ?

    
por Nick 27.05.2017 / 13:50

4 respostas

2

A ferramenta recomendada para processamento de texto é awk .

Tente isto:

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

Este comando imprime tudo a partir de categories até layout sem essa linha.

Saída:

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

Se você deseja ter apenas os itens entre categories e layout , basta adicionar um segundo padrão à condição if desta forma:

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

A sua saída será assim:

- tips
- programming
- howto
- another-tag
    
por 27.05.2017 / 15:17
2

Se você puder usar pcregrep (expressões regulares compatíveis com Perl):

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

ou usando a afirmação lookahead:

pcregrep -M 'categories(.|\n)*(?=layout)' file
    
por 27.05.2017 / 14:19
1
sed -e '/^categories:/,/^[^-]/!d;//d' yourfile
    
por 27.05.2017 / 21:26
0

Aqui está uma maneira de fazer isso com o awk. Quando você encontrar a linha de cabeçalho, imprima-a e continue recebendo a próxima linha e imprimindo-a, contanto que a próxima linha comece com - .

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

Tags