Fryboyter

Inhalt am Ende des Front-Matter-Bereichs einfügen

Wenn ich einen Artikel für fryboyter.de schreibe, erstelle ich hierfür eine Markdown-Datei, an deren Beginn ein Front-Matter-Bereich vorhanden ist. Dieser sieht beispielsweise wie folgt aus.

---
title: Inhalt am Ende des Front-Matter-Bereichs einfügen
date: 2022-11-02T20:21:11+0100
categories:
- OSBN
tags:
- Front Matter
- Markdown
- Sed
slug: inhalt-am-ende-des-front-matter-bereichs-einfuegen
---

In manchen Fällen will man diesen Bereich nachträglich erweitern. Zum Beispiel mit nositemap: true damit der Artikel nicht in der Sitemap der Internetseite erscheint. Bei einem einzelnen Artikel ist das schnell erledigt, indem man die Datei manuell ändert. Was, aber wenn es nicht einen, sondern mehrere Dateien betrifft? Dann wäre es besser wenn man die Änderungen automatisieren würde. Allerdings besteht der besagte Bereich nicht immer aus der gleichen Anzahl von Zeilen. Zum Beispiel weil ich mal mehr, mal weniger Tags verwende. Schlussendlich bin ich zu folgendem Ergebnis gekommen.

for file in $(find . -type f -name "*.md");
do
lines=$( sed -n '/^---$/=' $file | sed -n 2p )
sed -i -e "$lines i nositemap: true" $file
done

Die erste Zeile sucht im aktuellen Verzeichnis und allen darin vorhandenen Unterverzeichnissen nach Dateien mit der Endung .md. Die dritte Zeile prüft aus wie vielen Zeilen der jeweilige Front-Matter-Bereich besteht. Die vierte Zeile erweitert den Bereich am Ende abschließend um nositemap: true so dass dieser wie folgt aussieht.

---
title: Inhalt am Ende des Front-Matter-Bereichs einfügen
date: 2022-11-02T20:21:11+0100
categories:
- OSBN
tags:
- Front Matter
- Markdown
- Sed
slug: inhalt-am-ende-des-front-matter-bereichs-einfuegen
nositemap: true
---

Wer das Script erst einmal testen will ohne dass die Dateien gleich direkt geändert wird, sollte in Zeile 4 den Paramter -i entfernen. Dann werden die geänderten Dateien nur angezeigt ohne dass sie tatsächlich geändert werden.

OSBN

Zeichenkette an bestimmter Position in einer Datei einfügen

In einem Hauptverzeichnis sind diverse Dateien in Unterverzeichnissen vorhanden. In jeder dieser Dateien soll die gleiche Zeichenkette in die gleiche Zeile eintragen werden ohne das eine bereits vorhandene Zeile überschrieben wird. Nehmen wir als Beispiel einmal einen Front-Matter-Bereich eines der hier veröffentlichten Artikel.

---
title: WLAN-USB-Stick Cudy WU1300S unter Linux
date: 2021-05-02T16:49:00+0200
categories:
- OSBN
- Linux
tags:
- WLAN
- USB
slug: wlan-usb-stick-cudy-wu1300S-unter-linux
---

Was tun, wenn man nun beispielsweise zwischen der Zeile mit dem Datum und der Kategorie eine Zeile mit include_toc: true eintragen will? Am einfachst und aufwändigsten wäre es jede Datei händisch anzupassen. Da es sich aber um Dateien im drei- oder vierstelligen handelt, ist das keine gute Idee.

Um Dateien zu ändern, kann man das Tool sed nutzen, was eines der “Urgesteine” unter Linux ist.

sed -i'4 i include_toc: true' Dateiname

Die 4 gibt hierbei die gewünschte Zeile an. Das i dahinter steht für insert. Also einfügen.

Wer das ganze erst einmal testen will, ohne dass die Datei geändert wird, kann einfach -i bei dem Befehl entfernen. Dann wird der Inhalt der Datei inklusive der Änderung ausgegeben, ohne die Änderung zu speichern.

Bleibt nur noch wie man den Befehl auf alle betreffenden Dateien automatisch anwendet. Hier reicht, wie so oft, eine einfache Schleife.

#/bin/bash
for i in $(find posts -name '*.md');
do
    sed -i '4 i include_toc: true' $i
done;

Hiermit wird im aktuellen Verzeichnis sowie in den darin vorhandenen Unterverzeichnissen nach Dateien mit der Endung .md (Markdown-Dateien) gesucht. Diese werden dann mit dem sed Befehl entsprechend geändert.

OSBN | Linux