Beitragsdatum | 19.11.2016 |
---|---|
Letzte Aktualisierung | 22.11.2016 |
Betrifft | Linux allgemein, sed |
Ich wollte kürzlich in einem meiner Dokuwikis zahlreiche Seiten und Namensräume umbenennen. Es gibt für die Umbenennung einer Seite/eines Namensraumes ein Plugin: move.
Dieses Plugin kümmert sich dann auch gleich um die sogenannten Backlinks auf die umzubenennende Seite, verschiebt Seiten über Namensräume hinweg und ist sehr praktisch - so lange man nicht eine große Anzahl von Seiten/Namespaces verschieben möchte.
Da Dokuwiki auf Dateisystemebene Seiten speichert (in einfachen Textfiles) kann man für solche größeren Aufgaben Standard-Linux-Tools verwenden.
Für das Verschieben von Seiten benutzt man entsprechend mv
. Anschließend müssen aber die Backlinks auf die verschobenen Seiten angepasst werden. Dafür bietet sich sed an.
Es sollten diverse Muster gesucht und nur Teile davon ersetzt bzw. neue Teile innerhalb des Musters eingefügt werden.
Beispiel:
# Ist-Zustand: Ein Link im Dokuwiki: [[namespace:site1|Linktext]] # Soll-Zustand: statt site1 soll site001 eingetragen sein Ein Link im Dokuwiki: [[namespace:site001|Linktext]]
[[namespace:site
→ wird zu Variable1[0-9]
→ wird zu Variable2\(
und \)
\1
, \2
usw. referenziert werdensed 's/\(\[\[namespace:site\)\([0-9]\{1\}\)/\100\2/g' # Suchmuster: "[[namespace:site" (Variable1) und [0-9] (Variable2) # Ersetzung: "[[namespace:site"00 und die Zahl, die oben gefunden wurde, also: Variable100Variable2
Test:
# Inhalt Textdatei: test.txt Test [[namespace:site1|Link]] Testtest [[namespace:site2|Link]] # sed: sed 's/\(\[\[namespace:site\)\([0-9]\{1\}\)/\100\2/g' test.txt # Ausgabe: Test [[namespace:site001|Link]] Testtest [[namespace:site002|Link]]
Das mag kompliziert aussehen, ist aber sehr praktisch, um viele Dateien zu bearbeiten.
Quellen: