Textstellen in vielen xml Datein suchen und ersetzen

t3lly

t3lly

Aktives Mitglied
Thread Starter
Dabei seit
24.02.2009
Beiträge
3.589
Reaktionspunkte
406
Mit Automator hab ich bisher eigentlich noch nichts gemacht. Ich war aber immer interessiert, konnte aber noch keinen Anwendungsfall für mich finden. Jetzt hab ich aber einen und zwar:

Ich hab einen Ordner mit ca 20 xml Dateien (Playlisten). In diesen soll ein darin enthaltener Pfad, also eine Textstelle gefunden und durch eine von mir vorgegebene ersetzt werden, also z.B:

file://localhost/Users/GERD/Music/iTunes/iTunes%20Music/

soll in allen xmls an allen Stellen ersetzt werden durch:

file://localhost/Users/ALFRED/Music/iTunes/iTunes%20Music/

Geht so etwas mit Automator? Könnte man mir schnell erklären wie ich das mache? Ich habs versucht und kam nicht weiter. Vllt gibt es auch allg Tuts, mit denen ich so was lernen/umsetzten kann. Bin durchaus gewillt selbst aktiv zu werden. Wenn es schnell geht hab ich aber auch nichts gegen eine kleine Anleitung/Einweisung. Wäre super nett
 
Ohne dich enttäuschen zu wollen, verweise ich mal auf den gepinnten Beitrag von chebfarid:

Automator kann nicht Kaffe kochen…

Dein Vorhaben ist nur dann möglich, wenn du ein Programm hast, dass diese Funktionalität bietet UND dass eine Automatorschnittstelle bietet, die diese Funktion bietet.... du siehst, alles ein bisschen verzweigt und du ahnst – Mac OS X bringt derartiges nicht mit*!
Ggf. bringen Texteditoren solche Funktionen auch in den Automator, allerdings kenne ich keine. Smultron kann es, aber eben nicht als Automator Aktion.

Um das Problem an sich zu lösen, hast du also zwei Möglichkeiten: Entweder du magst es einfach und nutzt einen guten Texteditor, z.B. Smultron – das wäre der schnelle Weg, mit dem Nachteil, dass es ab einer relativ geringen Anzahl an Dateien sehr zäh werden könnte und Smultron oder dein Computer evtl. nicht mehr mag. Ob diese Anzahl bei 50 oder 500 Dateien liegt, kann ich aber nicht sagen.

Oder du möchtest OS X etwas besser kennen lernen und dir geht es um das Prinzip, wie man so etwas elegant löst – dann bleibt dir die Wahl zwischen Applescript und der Unix Shell (und ggf. Shell Scripting)**. Letzteres wäre unabhängiger vom Betriebssystem, das alle *nices es können (Linux, Unix, BSD, Mac OS X...); ersteres wäre eine Apple eigene Lösung, von der zumindest Apple denkt, dass sie einfacher zu erlernen ist.
Der Vorteil der Scriptsprachen ist gleichzeitig deren größter Nachteil: So eine Sprache ist flexibel (man könnte auch sagen "komplex") und muss erlernt werden. Ob es gegenüber dem Texteditor Performancevorteile gibt, kann ich nicht sagen. Aus dem Bauch heraus würde ich es aber erwarten.



*Ich kann dies zumindest für 10.5 Leopard sagen. 10.6 Snow Leopard habe ich nicht.

** … und einer x-beliebigen anderen Scriptsprache, z.B. Python & Co
 
Zuletzt bearbeitet:
Hallo,

wenn das eine Einmal-Sache ist und Du es eh schnell haben möchtest: Warum nimmst Du nicht einfach TextEdit?

- XML mit TextEdit öffnen
- Suchen: GERD
- Ersetzen: ALFRED

Das ganze halt 20 Mal. Dafür brauchst Du vielleicht 5 Minuten.

Viele Grüße

PS: Wenn das von iTunes ist, dann glaube ich nicht, dass dieser Weg der richtige ist.
 
Könnte mit folgendenTool gehen XSH: http://xsh.sourceforge.net
Das ist ein perl package, man muß das also zu Fuß programmieren.

Alternativ:
kurzes foundation app das die XML files einliest, parst und entsprechend verändert. Es gibt extra klassen zum Bearbeiten von XML files.
 
wenn es eine reine Text Datei ist kann man auch einfach das Terminal und ein sed Kommando nutzen.
Oder alle in einem Texteditor aufmachen und dann ein globales suchen und ersetzen.
 
Hallo!
Senf? Ok, da darf meiner nicht fehlen :p


Ohne dich enttäuschen zu wollen, verweise ich mal auf den gepinnten Beitrag von chebfarid:

Automator kann nicht Kaffe kochen…

Dein Vorhaben ist nur dann möglich, wenn du ein Programm hast, dass diese Funktionalität bietet UND dass eine Automatorschnittstelle bietet, die diese Funktion bietet.... du siehst, alles ein bisschen verzweigt und du ahnst – Mac OS X bringt derartiges nicht mit*!
Ein schöner Beitrag. Nur bitte eines nicht vergessen. Es gibt natürlich für den Automator jede Menge Aktionen zum Nachrüsten -- So war das ja auch von Apple gedacht :)
Allerdings kenne ich keine einfache und kostenlose Aktion, die genau das gewünschte liefert (Was nicht heißen soll, dass es sie nicht gibt)

Warum nimmst Du nicht einfach TextEdit
Das funktioniert gut, hat allerdings einen klitze-klitzekleinen Schönheitsfehler. TextEdit speichert xml nicht mit allen Attributen (file/creator type). Nicht richtig schlimm, aber auch nicht schön.

Könnte mit folgendenTool gehen XSH: http://xsh.sourceforge.net
Das ist ein perl package, man muß das also zu Fuß programmieren.

Alternativ:
kurzes foundation app das die XML files einliest, parst und entsprechend verändert. Es gibt extra klassen zum Bearbeiten von XML files.
Hier wurde nach einem Automator Workflow gefragt. Ich glaube, dass es hier um eine andere Liga geht.
Und wenn ich ein Freeware Programm jenseits eines guten Texteditors empfehlen würde, dann dieses: Klick

wenn es eine reine Text Datei ist kann man auch einfach das Terminal und ein sed Kommando nutzen.
Ach :cool:

Oder alle in einem Texteditor aufmachen und dann ein globales suchen und ersetzen.
Gut, dass es noch mal erwähnt wurde :p

Grüße und ein schönes Wochenende (trotz Miesepeter-Wetter)
Varuna
 
Hallo!
Senf? Ok, da darf meiner nicht fehlen :p

.....

Ach :cool:


Grüße und ein schönes Wochenende (trotz Miesepeter-Wetter)
Varuna

Man kann sogar Terminal Kommandos in ein Automator Workflow einbauen.;) Noch mal als wink mit dem Gartenzaun:D
 
puhh danke für die vielen Antworten. Ja es handelt sich um eine iTunes Playlisten Datei. Ich dachte halt, dass es mit dem Automator geht, da ja Textedit auch im Automator enthalten ist.
Werde es dann wohl von Hand machen.
 
Könnte mit folgendenTool gehen XSH: http://xsh.sourceforge.net
Das ist ein perl package, man muß das also zu Fuß programmieren.
...
Warum ein Perl package, wenn Perl solche einfachen Aufgaben schon von Haus aus kann :confused:

Um z.B. alle Vorkommen der Zeichenfolge 'GERD' in die Zeichenfolge 'ALFRED' umzuwandeln
genügt dieser Einzeiler (da braucht man nicht mal ein Skript für).

Code:
perl -pi -e 's/GERD/ALFRED/g' [I]datei[/I]
 
PS: Wenn das von iTunes ist, dann glaube ich nicht, dass dieser Weg der richtige ist.

:unterschreibe:

iTunes könnte da ziemlich rumzicken, wenn du manuell was in den Playlisten veränderst. Oder im anderen Fall ignoriert es deine Änderungen vollkommen, da iTunes die XML-Dateien gar nicht braucht - soweit ich weiß, benutzt iTunes seine Mediathek-Datei und generiert die XMLs bei jedem Start neu.

Auf jeden Fall eine Sicherungskopie machen oder Time Machine anschalten!
 
nah das sind exportierte playlisten, bei denen ich den Pfad ändere und dann werden sie wieder importiert. Das funktioniert auch, habs ausprobiert.

danke maceis, das probier ich dann mal. Die Ziele kommt ins Terminal nehme ich an? Die tatsächliche Pfadänderung wird ein bisschen anders (komplizierter) aussehen. Mir ist die Logik der Zeile nicht ganz klar. Ich poste noch mal den genauen Pfad.

/es sind übrigens insg. 520 Playlisten. Daher ist das "von Hand" doch nicht ganz so easy.
 
Hallo t3lly!

Ich denke nach wie vor, MassReplaceIt ist die richtige Wahl für dich. Da brauchst Du nicht zu wissen, wie was im Terminal erstellt wird. Geh in die Einstellungen des Programmes und stelle ein, dass Ordnerinhalte durchsucht werden. Ziehe den Ordner mit den 520 Dateien ins "files" Fenster, benenne Suche und Ersetzung und fertig.

Ausserdem kannst Du mit dieser Anwendung natürlich auch die Suche wie ursprünglich gepostet starten. Nicht nur GERD sondern
file://localhost/Users/GERD/Music/iTunes/iTunes%20Music/

Ich stelle mir gerade vor, in der Playlist gibt es einen Song TIGERDANCE.
Rate mal, wie der nach Bearbeitung mit dem Perl Script (in der jetzigen Form) heißen würde :D
Ok, der ist ein klein wenig an den Haaren herbeigezogen :)

Ansonsten: datei steht für den Pfad zu deiner Datei

Ich würde gerne noch ein bisschen Senf geben:
Das gepostete Perl Script brauche ich nicht zu testen, um zu sehen, dass dort die gleichen Attribute (wie schon beschrieben) flöten gehen. Das ist nicht soo schlimm (z.B. keine Quick Look Vorschau mehr), aber man macht das so halt nicht.
Perl bzw. nur sed ist mächtig und wäre natürlich die OS X integrierte Waffe. Ich bin zwar nicht so fit im Umgang damit, aber ich wüsste, wie ich einen Batch Ablauf mit einem AppleScript (in Verbindung mit sed) lösen würde.

Um auf bequiet zurück zu kommen: Ja, der Automator kann Terminal Kommandos integrieren und mit einem passenden Script würde das wohl auch gehen...

Der ist cool
 
Zuletzt bearbeitet:
Der Einzeiler war natürlich nur ein (einfaches) Beispiel.
Solange man nicht weiß, wie die gewünschte Änderung genau aussieht, macht es aber keinen Sinn, ein kompliziertes Suchen/Ersetzen Muster auszutüfteln.

Wenn die gewünschte Änderung tatsächlich sehr komplex ist, versagen stoßen irgenwann auch die Möglichkeiten von entsprechenden grafischen Programmen an Grenzen.

Komisch ist übrigens auch dass aus
...
einen Ordner mit ca 20 xml Dateien (Playlisten)
...
nun plötzlich
...
/es sind übrigens insg. 520 Playlisten
geworden ist. — Was denn nun :confused:
 
Hallo

Mir geht es eigentlich auch um diese Datei (iTunes Music Library.xml), ich möchte da auch meine lokale Datei auf ein NAS-Share kopieren und dort dann einen Wert "/Volumes/" durch den Wert "/volume1/" ersetzen und anschliessend die Datei speichern.

Die ganze Sache sollte dann auch zeitgesteuert ablaufen.

Ich habe die Sache schon mal mit einem AppleScript versucht zu lösen, doch da scheitert es am TextEditor ... Datei zu gröss.

tell application "Finder"
activate
copy file "Macintosh HD:Users:myuser:Music:iTunes:iTunes Music Library.xml" to folder "Macintosh HD:Users:myuser1:Documents"
end tell

tell application "Finder"
activate
open document file "Macintosh HD:Users:myuser1:Documents:iTunes Music Library.xml"
tell application "TextEdit"
set test_str to text of document 1
set AppleScript's text item delimiters to "/Volumes/"
set test_items to text items of test_str
set AppleScript's text item delimiters to "/volume1/"
set final_str to test_items as text
set text of document 1 to final_str
close document 1 saving yes
end tell

end tell

Gibt es vielleicht noch eine andere Variante oder Trick wie ich dies lösen könnte?

Besten Dank
Gruss
 
@maceis: im ersten Post hab ich die 5 irgendwie verschluckt. Es sind 520.

Danke für die Hilfe, ich nehm das Prog dafür
 
Zurück
Oben Unten