Tengo muchas publicaciones de Jekyll _posts
con 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 categories
línea y mostrar n
las 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 categories
hasta layout
sin esta línea.
Producción:
categories:
- tips
- programming
- howto
- another-tag
Si solo desea tener los elementos entre categories
y, layout
simplemente puede agregar un segundo patrón a la if
condició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 (/^-/) }'