Encuentra todas las líneas que siguen un patrón y comienzan con un carácter.

Encuentra todas las líneas que siguen un patrón y comienzan con un carácter.

Tengo muchas publicaciones de Jekyll _postscon metadatos YAML en el encabezado, incluidas categories, como esta:

---
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
---

Entonces sé cómo buscar la categorieslínea y mostrar nlas líneas después de ( -An)... pero ¿hay alguna manera de hacer que se muestren todas las líneas siguientes que comienzan con -, obviamente, cada publicación tiene un número diferente? ¿Quizás todas las líneas hasta layout?

Respuesta1

La herramienta recomendada para el procesamiento de textos es awk.

Prueba esto:

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

Este comando imprime todo, desde categorieshasta layoutsin esta línea.

Producción:

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

Si solo desea tener los elementos entre categoriesy, layoutsimplemente puede agregar un segundo patrón a la ifcondición como este:

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

Entonces su salida se verá así:

- tips
- programming
- howto
- another-tag

Respuesta2

Si puede utilizar pcregrep(expresiones regulares compatibles con Perl):

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

o usando una aserción de anticipación:

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

Respuesta3

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

Respuesta4

Aquí hay una manera de hacerlo con awk. Cuando encuentre la línea del encabezado, imprímala y continúe obteniendo la siguiente línea e imprimiéndola, siempre que la siguiente línea comience con -.

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

información relacionada