Der Titel wird dem Inhalt nicht ganz gerecht, aber dieser Post ist eh nur als Erinnerungsstütze für mich gedacht. Also, folgendes Skript:
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash # workaround to allow multi-commands: cmd="" for directory in dir1 dir2 dir3 do if [ -d $directory ] then cmd="find $directory -regextype posix-extended -regex ".*.html" -exec sed -i 's:href="../../([a-z]{2})/contact/:href="https://myDomain.com/1/contact/:g' {} ;" eval $cmd fi done |
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