Shell-Befehle auf Obsidian-Seiten ausführen — Teil 2

In die­sem zwei­ten Teil gehe ich auf einen Artikel von Gareth Stretton ein, den Gareth auf Medium.com (lei­der hin­ter einer pay­wall) ver­öf­fent­licht hat. Gareth erwei­tert den Ansatz aus dem ers­ten Teil, um eine inter­es­san­te Variante zur Anwendung von Shell-Befehlen auf Texte in einer Obsidian-Notiz, die beson­ders zur Textmanipulation genutzt wer­den kann.

Dazu wird eine „User Functions” im Templater Plugin sowie ein Template „run shell-com­mand” benö­tigt:

Definition des Templates "run shell-command" mit dem Aufruf <% tp.user.shell( {COMMAND: tp.file.selection()} ) %>
Template zum Aufruf der User Function
Defintion der User Function "shell" mit bash -c "$COMMAND"
Definition der User Function „shell”

Der Ausdruck

<% tp.user.shell( {COMMAND: tp.file.selection()} ) %>

im Template weist den aus­ge­wähl­ten Text in der Notiz der Variablen $COMMAND zu und ruft dann die im Template defi­nier­te Funktion shell auf, die den Inhalt der Variablen $COMMAND aus­wer­tet und das Ergebnis an die Stelle des aus­ge­wähl­ten Textes schreibt. Vor dem Aufruf des Templates muss also eine Zeichenkette aus­ge­wählt wer­den, die in einer Bash-Shell aus­führ­bar ist.

Diese Vorgehensweise soll am Beispiel des aktu­el­len Wetters aus Teil 1 ver­deut­licht wer­den. Dazu wird der ent­spre­chen­de curl-Befehl in die Notiz geschrie­ben und aus­ge­wählt, dann wird über die Befehlspalette oder den vor­de­fi­nier­ten Hotkey das „run shell-com­mand” Template ein­ge­fügt, der aus­ge­wähl­te Text aus­ge­wer­tet und durch das aktu­el­le Wetter ersetzt.

Anwendung von "Templater: Insert Templates/run shell-command" auf curl wttr.com Text. Der Text wird zu String mit den aktuellen Wetterdaten (animiertes gif)
Anwendung von „Templater: Insert Templates/run shell-com­mand” auf curl wttr.com Text

Dieser Ansatz ist jedoch mit Vorsicht zu genie­ßen, da auch kri­ti­sche Befehle unge­fragt aus­ge­führt wer­den und unter Umständen Schaden anrich­ten kön­nen. Als Beispiel für einen unge­fähr­li­chen Betriebssystembefehl soll der Befehl ls die­nen, also das Auflisten aller Dateien in einem Verzeichnis, aber auch rm, also der Löschbefehl wür­de ohne Murren aus­ge­führt wer­den.

Anwendung von "Templater: Insert Templates/run shell-command" auf ls. Der Text wird zu Liste mit den den Ordner Namen (animiertes gif)
Anwendung von „Templater: Insert Template/run shell-com­mand” auf ls

Gareth ver­wen­det die­se Methode in sei­nem Artikel, um Texte zu mani­pu­lie­ren. In sei­nem Beispiel zeigt er, wie er eine aus der Wikipedia kopier­te Liste in ein gül­ti­ges Markdown umwan­delt. Dieses Beispiel konn­te ich nicht nach­voll­zie­hen, da bei mir die­se Liste direkt ohne Umwege als Markdown-Tabelle ver­wen­det wird.

Um aber das Prinzip zu erklä­ren, habe ich mit ChatGPT einen Text erstel­len las­sen, der aus 6 Zeilen besteht, die jeweils durch eine Leerzeile getrennt sind. Das ist auch für mich eine sinn­vol­le Anwendung, da ich oft Texte aus der Zwischenablage in eine Notiz ein­fü­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 wei­tern Zeilen umschlos­sen und die­ser Text dann aus­ge­wä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 über­gibt die Zeilen dann (piped) an den grep-Befehl, wobei mit <strong>grep .</strong> nur die Zeilen aus­ge­ge­ben wer­den, die min­des­tens ein Zeichen ent­hal­ten.

Auf die­se Weise wer­den beim Aufruf des shell-com­mand Templates alle Leerzeilen aus dem selek­tier­ten Text ent­fernt:

Beispiel für den Einsatz von User Function/Tempates auf einen Text. Der im Text vorderbeschrieben Aufruf ändert den markierten Text und löscht die Leerueilen (animiertes gif)
Beispiel für den Einsatz von User Function/Tempates auf einen Text

In guter alter Unix Manier kann dies dann auch erwei­tert wer­den, also ein Ergbnis eines Kommandos als Input zunächst gepi­ped wer­den und so ent­fernt das nächs­te Beispiel die lee­ren Zeilen und alle Zeilen in denen Lorem vor­kommt:

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 umge­kehrt es zeigt nur die Zeilen in denen das Wort vor­kommt:

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 aus­kennt, kann auf die­se Weise kom­ple­xe Workflows erstel­len. Gareth zeigt in sei­nem Artikel eini­ge wei­te­re Beispiele, die ich auf dem Mac aller­dings nicht alle nach­voll­zie­hen konn­te.

Wenn kom­ple­xe­re Befehlskette öfter benö­tigt wer­den, kön­nen die­se natür­lich auch direkt als wei­te­re „User Function” defi­niert wer­den z.B. unter zu Hilfenahme des Trick mit der Variablen, oder die Zeichenkette als Textbaustein in den Systemeinstellungen unter „Textersetzungen” beim Mac defi­niert, wel­che dann über eine kur­ze Zeichenfolge auf­ge­ru­fen wird.

Nachtrag:

In einem wei­te­ren Artikel stellt Gareth eine Erweiterung die­ses Ansatzes vor. Dabei kommt ein JScript als User Function zum Einsatz, dass den Wrapper (cat << EOF ... EOF) schreibt und dann ein PopUp anbie­tet, in dem das gewünsch­te Commando ein­ge­tippt wer­den kann und dann aus­ge­führt wer­den kann.

Wie immer kön­nen ger­ne Kritik, Korrekturen und ande­res Feedback in den Kommentaren hin­ter­las­sen wer­den.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert