Heute habe ich wieder gesehen, wie nützlich Ruby-Einzeiler sind. Das Kommando ruby akzeptiert die aus Perl bekannten Schalter-e, -n und -p.
Hinweis: Ich hoffe doch mal, jeder kennt LaTeX!
Mein Arbeitgeber (und Prof) hat uns die TeX-Quellen seiner Vorlesung gegeben. Ich wollte herausfinden, wofür er die notes-Umgebung bisher eingesetzt hat. Dafür hätte ich mehrere Dokumente einzeln öffnen und nach solchen Blöcken durchssuchen müssen:
\begin{notes}
Beispiel:
$\phi:=\exists x( Ryz\wedge \forall y(\neg y\eq x\vee Ryz))$.
\end{notes}
Wir sind doch nicht mehr im Mittelalter! Konsole öffnen, Ruby fragen:
ruby -ne "print if /\\\\begin\\{notes\\}/ .. /\\\\end\\{notes\\}/" *.tex
\begin{notes}[1A]
Beispiele an der Tafel
\end{notes}
\begin{notes}[1B]
Beweis an der Tafel
\end{notes}
\begin{notes}[1C]
Abgeleitete Regeln werden mit zwei Buchstaben bezeichnet
Beweise an der Tafel
...
Voilà ! Sämtliche Daten, die mich interessieren, werden herausgefiltert.
Am Besten man schickt das gleich an einen Editor, damit man in Ruhe lesen kann:
ruby -ne "..." *.tex | gvim -c "set ft=tex" -
Außerdem brauchten wir noch eine Dokumentation zur Makro-Datei, in der allerhand Abkürzungen in der Form
\\nc{\\Bigmid}{\\;\\Big|\\;}
standen. Einen Prototyp erzeugte ich ebenfalls sehr einfach mittels ruby -ne. 5 Minuten später war das Dokument fertig.
Gerade wer Ruby als Hochsprache einsetzt und objektorientiert programmiert, der vergisst leicht, dass Ruby auch eine Scriptsprache ist. Ruby kann praktisch alles, was Perl kann, nur einfacher. Und Perl kann alles, was die Shell kann, nur einfacher.
Wer ruby -h mit perl -h vergleicht, könnte Ruby für einen Perl-Klon halten.
Hier die zehn (für mich) wichtigsten Optionen:
Ruby the Shell!
Kommentar schreiben
Kommentare
Mich wundert, dass das hier "ruby -ne "print if /\\begin\{notes\}/ .. /\\end\{notes\}/†*.tex" noch funktioniert (auch mit Ruby 1.8). In der (relativ) neuen PickAxe steht auf Seite 68 (Druckversion), dass seit Version 1.8 die Kurzform "if /regex1/ .. /regex2/" für den ausführlichen Ausdruck "if $_ =~ /regex1/ .. $_ =~ /regex2/" nicht mehr unterstützt wird. Sei soll immer 'true' liefern. Für abgespeicherte Programme kann ich das bestätigen: puts 'Versuch in Kurzform' File.open('rubyt.txt', 'r') do |f| while f.gets print if /2/ .. /4/ end end puts "\nVersuch in Langform" File.open('rubyt.txt', 'r') do |f| while f.gets print if $_ =~ /2/ .. $_ =~ /4/ end end gibt: Versuch in Kurzform 1 2 3 4 5 Versuch in Langform 2 3 4 Kennt jemand dafür eine Begründung?
!Sorry, musste zweite Mailadresse angeben, weil das System weder eine Ergänzung meiner ersten Anmerkung, noch eine direkt folgende zweite erlaubt! Hab die Erklärung gefunden. Lag leider an der manchmal unangenehmen Eigenart der PickAxe, dass Informationen über eine Sache im Buch meist stark verteilt sind. Auf Seite 342 ganz unten steht, dass die alte (=vor Ruby 1.8) Form "if /regex1/ .. /regex2/" noch unterstützt wird, sofern die Option "-e" im Kommaqndo angegeben ist. Also als Einzeiler geht das ganz offiziell auch weiterhin.