Finde alle Zeilen, die einem Muster folgen und mit einem Zeichen beginnen

Finde alle Zeilen, die einem Muster folgen und mit einem Zeichen beginnen

Ich habe also viele Jekyll-Posts _postsmit YAML-Metadaten im Header, darunter categoriesbeispielsweise diesen:

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

Ich weiß also, wie ich nach der categoriesZeile greppe und ndie Zeilen nach ( -An) anzeigen kann... aber gibt es eine Möglichkeit, alle folgenden Zeilen anzuzeigen, die mit beginnen -, da jeder Beitrag offensichtlich eine andere Nummer hat? Vielleicht alle Zeilen bis layout?

Antwort1

Das empfohlene Tool zur Textverarbeitung ist awk.

Versuche dies:

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

Dieser Befehl druckt alles ab „ categoriesbis“ layoutohne diese Zeile selbst.

Ausgabe:

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

categoriesWenn Sie nur die Elemente zwischen und haben möchten, layoutkönnen Sie der ifBedingung einfach ein zweites Muster wie folgt hinzufügen:

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

Ihre Ausgabe sieht dann folgendermaßen aus:

- tips
- programming
- howto
- another-tag

Antwort2

pcregrepWenn Sie (Perl-kompatible reguläre Ausdrücke) verwenden können :

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

oder mithilfe der Lookahead-Assertion:

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

Antwort3

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

Antwort4

So geht das mit awk: Wenn Sie die Kopfzeile gefunden haben, drucken Sie sie aus, und holen Sie sich die nächste Zeile und drucken Sie sie aus, solange die nächste Zeile mit einem beginnt -.

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

verwandte Informationen