In diesem zweiten Teil gehe ich auf einen Artikel von Gareth Stretton ein, den Gareth auf Medium.com (leider hinter einer paywall) veröffentlicht hat. Gareth erweitert den Ansatz aus dem ersten Teil, um eine interessante Variante zur Anwendung von Shell-Befehlen auf Texte in einer Obsidian-Notiz, die besonders zur Textmanipulation genutzt werden kann.
Dazu wird eine „User Functions” im Templater Plugin sowie ein Template „run shell-command” benötigt:
Der Ausdruck
<% tp.user.shell( {COMMAND: tp.file.selection()} ) %>
im Template weist den ausgewählten Text in der Notiz der Variablen $COMMAND zu und ruft dann die im Template definierte Funktion shell auf, die den Inhalt der Variablen $COMMAND auswertet und das Ergebnis an die Stelle des ausgewählten Textes schreibt. Vor dem Aufruf des Templates muss also eine Zeichenkette ausgewählt werden, die in einer Bash-Shell ausführbar ist.
Diese Vorgehensweise soll am Beispiel des aktuellen Wetters aus Teil 1 verdeutlicht werden. Dazu wird der entsprechende curl-Befehl in die Notiz geschrieben und ausgewählt, dann wird über die Befehlspalette oder den vordefinierten Hotkey das „run shell-command” Template eingefügt, der ausgewählte Text ausgewertet und durch das aktuelle Wetter ersetzt.
Dieser Ansatz ist jedoch mit Vorsicht zu genießen, da auch kritische Befehle ungefragt ausgeführt werden und unter Umständen Schaden anrichten können. Als Beispiel für einen ungefährlichen Betriebssystembefehl soll der Befehl ls dienen, also das Auflisten aller Dateien in einem Verzeichnis, aber auch rm, also der Löschbefehl würde ohne Murren ausgeführt werden.
Gareth verwendet diese Methode in seinem Artikel, um Texte zu manipulieren. In seinem Beispiel zeigt er, wie er eine aus der Wikipedia kopierte Liste in ein gültiges Markdown umwandelt. Dieses Beispiel konnte ich nicht nachvollziehen, da bei mir diese Liste direkt ohne Umwege als Markdown-Tabelle verwendet wird.
Um aber das Prinzip zu erklären, habe ich mit ChatGPT einen Text erstellen lassen, der aus 6 Zeilen besteht, die jeweils durch eine Leerzeile getrennt sind. Das ist auch für mich eine sinnvolle Anwendung, da ich oft Texte aus der Zwischenablage in eine Notiz einfüge, die ein paar Leerzeilen zu viel hat.
Zeile 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin fringilla gravida magna.
Zeile 2: Nullam luctus mi vel augue laoreet tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Zeile 3: Sed at pulvinar urna. Integer tincidunt lectus vel elit fringilla, in ultrices ligula pellentesque.
Zeile 4: Quisque convallis tristique tortor, in gravida odio dignissim eu. Lorem id dui non justo volutpat convallis.
Zeile 5: Fusce ut leo eu metus accumsan auctor eget in ante. Cras venenatis, mi ut malesuada consectetur, massa nisi semper nisi, id commodo mi elit in elit.
Zeile 6: Aenean eu elit vel purus condimentum placerat id in justo. Nam ullamcorper urna vel purus aliquet volutpat.
Dieser Text wird nun in einer Notiz von zwei weitern Zeilen umschlossen und dieser Text dann ausgewählt.
cat << EOF | grep .
Zeile 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin fringilla gravida magna.
Zeile 2: Nullam luctus mi vel augue laoreet tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
...
Zeile 6: Aenean eu elit vel purus condimentum placerat id in justo. Nam ullamcorper urna vel purus aliquet volutpat.
EOF
Der cat-Befehl liest die Textzeilen von der Standardeingabe bis zum EOF und übergibt die Zeilen dann (piped) an den grep-Befehl, wobei mit <strong>grep .</strong>
nur die Zeilen ausgegeben werden, die mindestens ein Zeichen enthalten.
Auf diese Weise werden beim Aufruf des shell-command Templates alle Leerzeilen aus dem selektierten Text entfernt:
In guter alter Unix Manier kann dies dann auch erweitert werden, also ein Ergbnis eines Kommandos als Input zunächst gepiped werden und so entfernt das nächste Beispiel die leeren Zeilen und alle Zeilen in denen Lorem vorkommt:
cat << EOF | grep . | grep -v 'Lorem'
Zeile 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin fringilla gravida magna.
Zeile 2: Nullam luctus mi vel augue laoreet tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
...
Zeile 6: Aenean eu elit vel purus condimentum placerat id in justo. Nam ullamcorper urna vel purus aliquet volutpat.
EOF
Oder umgekehrt es zeigt nur die Zeilen in denen das Wort vorkommt:
cat << EOF | grep . | grep 'Lorem'
Zeile 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin fringilla gravida magna.
Zeile 2: Nullam luctus mi vel augue laoreet tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
...
Zeile 6: Aenean eu elit vel purus condimentum placerat id in justo. Nam ullamcorper urna vel purus aliquet volutpat.
EOF
Wer sich ein wenig mit den Linux-Befehlen zur Textmanipulation auskennt, kann auf diese Weise komplexe Workflows erstellen. Gareth zeigt in seinem Artikel einige weitere Beispiele, die ich auf dem Mac allerdings nicht alle nachvollziehen konnte.
Wenn komplexere Befehlskette öfter benötigt werden, können diese natürlich auch direkt als weitere „User Function” definiert werden z.B. unter zu Hilfenahme des Trick mit der Variablen, oder die Zeichenkette als Textbaustein in den Systemeinstellungen unter „Textersetzungen” beim Mac definiert, welche dann über eine kurze Zeichenfolge aufgerufen wird.
Nachtrag:
In einem weiteren Artikel stellt Gareth eine Erweiterung dieses Ansatzes vor. Dabei kommt ein JScript als User Function zum Einsatz, dass den Wrapper (cat << EOF ... EOF)
schreibt und dann ein PopUp anbietet, in dem das gewünschte Commando eingetippt werden kann und dann ausgeführt werden kann.
Wie immer können gerne Kritik, Korrekturen und anderes Feedback in den Kommentaren hinterlassen werden.
Schreibe einen Kommentar