bash: Suchen und Ersetzen über ganze Verzeichnisse

Der Titel wird dem Inhalt nicht ganz gerecht, aber dieser Post ist eh nur als Erinnerungsstütze für mich gedacht. Also, folgendes Skript:

lehrt uns:

  • während man find $directory -regextype posix-extended -regex “.*.html” direkt aus dem Skript heraus ausführen könnte, muss man für multiple Befehle (wie heißen die eigentlich?) den Umweg über eval und einen String gehen
  • insbesondere kann man auf diese Weise die Schleifenvariable $directory in den Befehlen nutzen!
  • um Warnungen zu vermeiden, würde ich immer prüfen, ob das Zielverzeichnis existiert – und ein Verzeichnis ist: if [ -d $directory ]
  • find nutzt Reguläre Ausdrücke, wie man sie kennt – und wenn ich “man” sage, meine ich mich (und nicht man, haha): “.” ist ein beliebiger Character, für den String muss man escapen (“.”), also liefert “.*.html” alle HTML-Dateien in Unterverzeichnissen
  • sed dagegen funktioniert umgedreht: “.” ist der String, “.” der beliebige Character. Die Verbindung der beiden Versionen macht einen ein wenig schizophren 🙂
  • Deshalb muss man runde Klammern für Gruppen ebenfalls escapen – eckige Klammern unmittelbar darin aber wiederum nicht^^ so richtig durchschaut habe ich das noch nicht; wenn irgendwas nicht geht, würde ich hier anfangen, den Fehler zu suchen
  • Quantifikatoren, Pipes (für logisches OR), geschwungene Klammern, etc. müssen (meistens?) ebenfalls escaped werden
  • Das erste Zeichen nach “s” ist übrigens der Trenner von needle und replacement; man kann im Wesentlichen wohl nehmen, was man will. Der Übersichtlichkeit halber habe ich auf “/” zugunsten von “:” verzichtet. “@” fand ich auch noch ganz gut. Halt irgendwas, nach dem man nicht gerade sucht; andernfalls muss man escapen, so wie oben in “https://”
  • Referenzen sind in sed nicht $1, $2, …, sondern 1, 2, …

Insgesamt soll das obige Skript in allen HTML-Dateien in den Verzeichnissen dir1, dir2 und dir3 (und Unterverzeichnissen) die relativen Pfade “../../de/contact”, “../../en/contact”, usw in absolute URLs ändern, ohne dabei die Sprache zu verlieren

Java: Keylistener auf Konsolenebene

java

Man kann GUIs bauen mit Java – wenn man will. AWT und Swing existieren. Eigentlich ist Java aber konsolenbasiert. Um so erstaunlicher, dass es von Haus aus (immer noch) keine Möglichkeit gibt, einzelne Zeichen einzulesen, ohne nach Eingabe auf Return/Enter warten zu müssen. Das wäre aber nötig, um zB die (komfortable) Steuerung einer Konsolenanwendung mit der Tastatur zu ermöglichen. Mit dem Package JLine (speziell ConsoleReader.readCharacter) kann man das – hier die “Hello World“-Version:

HTH