WinFuture-Forum.de: Xml-datei Mit Bash Script Bearbeiten - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Xml-datei Mit Bash Script Bearbeiten Zwei Zeilen ersetzen


#1 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 16. Juli 2009 - 17:34

Hi,

ich versuche gerade mit einem bash Script eine XML-Dtei zu bearbeiten, und möchte dabei gerne zwei Zeilen die direkt untereinander stehen ersetzen.
Folgendermaßen sehen die Zeilen aus:
<key>Family ID</key>
<integer>15</integer>


Der Wert 15 in der zweiten Zeile sollte auch ersetzt werden, wenn er z.B. 4711 lautet. Kann man das irgendwie variabel gestalten? Hab schon etwas mit sed versucht, aber wie es scheint, kommt sed nicht mit absätzen klar!

Jemand ne idee, wie ich das machen könnte?

Vielen Dank!

lg,
Fabi

Dieser Beitrag wurde von Fabi bearbeitet: 16. Juli 2009 - 17:35

0

Anzeige



#2 _lustiger_affe_

  • Gruppe: Gäste

geschrieben 16. Juli 2009 - 19:39

Zitat

und möchte dabei gerne zwei Zeilen die direkt untereinander stehen ersetzen.
Ja und, womit?

Allgemein, kein großes Problem mit awk oder perl/ruby, sed geht auch, allerdings etwas umständlicher.

Hab keine Lust, dir was aus der Nase zu ziehen, also bitte...
0

#3 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 16. Juli 2009 - 19:51

Zitat

Hab keine Lust, dir was aus der Nase zu ziehen, also bitte...

Sorry, hast ja recht ;) !

laso folgendes, mit diesem "Hack" kann man den GoogleSync für die Kontakte unter OS X auch ohne iPod Touch oder iPhone aktivieren.

Jetzt würd ich die Bearbeitung der plist gerne per Script machen,
das hab ich bis jetzt:
#!/bin/bash

#kopieren der vorhandenen Datei com.apple.iPod.plist /Backup erstellen
cp com.apple.iPod.plist com.apple.iPod.plist_bkp

#löschen der vorhandenen Datei com.apple.iPod.plist
#rm com.apple.iPod.plist

#Konvertieren der *.plist Datei in XML-Format
plutil -convert xml1 com.apple.iPod.plist
cp com.apple.iPod.plist com.apple.iPod.plist_bkp2

#Ändern des Werts Family-ID auf 10001
sed "s/	<key>Family ID</key> <integer>15</integer>/	<key>Family ID</key><integer>10001</integer>/g" com.apple.iPod.plist_bkp > com.apple.iPod.plist

#Konvertieren der neuen Datei ins Binairy Format
plutil -convert binary1 com.apple.iPod.plist

Die XML Datei sieht folgendermaßen aus:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Devices</key>
	<dict>
		<key>000A27001FB2923F</key>
		<dict>
			<key>Connected</key>
			<date>2009-07-16T15:16:30Z</date>
			<key>Device Class</key>
			<string>iPod</string>
			<key>Family ID</key>
			<integer>15</integer>
			<key>Firmware Version</key>
			<integer>318</integer>
			<key>Firmware Version String</key>
			<string>1.0.3</string>
			<key>Games Platform ID</key>
			<integer>4</integer>
			<key>Games Platform Version</key>
			<integer>1</integer>
			<key>ID</key>
			<string>000A27001FB2923F</string>
			<key>Serial Number</key>
			<string>YM8495FC2ME</string>
			<key>Software Version</key>
			<integer>168001536</integer>
			<key>Updater Family ID</key>
			<integer>31</integer>
			<key>Use Count</key>
			<integer>84</integer>
		</dict>
	</dict>
	<key>com.apple.PreferenceSync.ExcludeAllSyncKeys</key>
	<true/>
	<key>conn:128:Last Connect</key>
	<data>
	xoUQ7g==
	</data>
</dict>
</plist>


Diesen Teil,
<key>Family ID</key>
<integer>15</integer>

möchte ich jetzt durch diesen Teil:
<key>Family ID</key>
<integer>10001</integer>

ersetzen.

Wobei der Integer Wert im ersten Teil, also die 15, ja von Gerät zu Gerät variieren kann, da ja nicht jeder einen iPod nano 4G besitzt.

Hoffe ich hab das jetzt verständlich erklärt ;)!

lg,
Gabi
0

#4 Mitglied ist offline   Internetkopfgeldjäger 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.718
  • Beigetreten: 29. Januar 04
  • Reputation: 1
  • Geschlecht:Männlich
  • Interessen::-)

geschrieben 16. Juli 2009 - 20:28

Ich habe da so ein Programm,
das den Verlauf zu löschen nicht anbietet,
also habe ich mir da einfach was mit sed gebastelt:
cat MEINE_DATEI | sed -E 's/Recent Files\[\$e\]=.{0,}[.]{0,}/Recent Files\[\$e\]=/g'  > MEINE_DATEI


Mit sed könntest Du dir da auch was basteln,
oder perl benutzen, falls installiert, Stichwort: Reguläre Ausdrücke.

Hinweise:
Manualpage zu sed lesen.
Manualpage zu perl lesen.
Wikipedia Artikel "Regulärer Audruck"
http://de.wikipedia....ulärer_Ausdruck
(enthält auch einige Beispiele)
Kann aber auch ein kleines Büchlein "Reguläre Ausdrücke"
von entwickler.press empfehlen, ISBN-3-935042-90-6,
hat 7,90 Euro gekostet, da kann man immer mal
gut nachschlagen. Ich finde es sehr nützlich:
http://entwickler-pr...,buchid,43.html
Das Büchlein passt in eine Hosentasche,
ist quasi im praktischen Spickformat gehalten.
0

#5 _lustiger_affe_

  • Gruppe: Gäste

geschrieben 16. Juli 2009 - 21:25

Vorrausgesetzt, die plist ist immer exakt gleich aufgebaut, d.h. nicht alles auf einer Zeile und der gewünschte <integer>-Block ist immer der erste, dann reicht schon

sed -e "s#<integer>[[:digit:]]*</integer>#<integer>10001</integer>#"


Geht garantiert noch besser, aber dafür bin ich grad zu faul.

Edit, @IKGJ, da merkt man die BSDler, andere nehmen einfach `sed -i` ;)

Dieser Beitrag wurde von lustiger_affe bearbeitet: 16. Juli 2009 - 21:25

0

#6 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 19. Juli 2009 - 11:40

Beitrag anzeigenZitat (funky_monkey: 16.07.2009, 22:25)

Vorrausgesetzt, die plist ist immer exakt gleich aufgebaut, d.h. nicht alles auf einer Zeile und der gewünschte <integer>-Block ist immer der erste, dann reicht schon

sed -e "s#<integer>[[:digit:]]*</integer>#<integer>10001</integer>#"

Danke, das werd ich versuchen, sobald ich daheim bin. Normalerweise dürfte das immer der erste Block sein, da die plist immer gleich aufgebaut ist.

lg,
Fabi
0

#7 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 20. Juli 2009 - 20:25

Beitrag anzeigenZitat (funky_monkey: 16.07.2009, 22:25)

sed -e "s#<integer>[[:digit:]]*</integer>#<integer>10001</integer>#"

Also das funktioniert schon ganz gut, leider wird jetzt jeder Integer Block mit dem Wert ersetzt :(!
Gibts da ne Abbruchanweisung?

lg,
Fabi
0

#8 _lustiger_affe_

  • Gruppe: Gäste

geschrieben 20. Juli 2009 - 22:36

Wieso jeder, hast du da noch ein "g" eingebaut? Bei mir funktionukelt das mit deiner Beispieldatei ohne Probleme, ka, was hat OSX denn für ein LineEnding-Zeichen?

Edit, kannst hinter die letzte "#" natürlich noch eine "1" setzen.

Dieser Beitrag wurde von lustiger_affe bearbeitet: 20. Juli 2009 - 22:36

0

#9 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 23. Juli 2009 - 16:30

Hmmm..leider funktioniert das ganze immer noch nicht, mein code sieht bis jetzt mal so aus:
#!/bin/bash

#kopieren der vorhandenen Datei com.apple.iPod.plist /Backup erstellen
cp com.apple.iPod.plist com.apple.iPod_bkp.plist

#löschen der vorhandenen Datei com.apple.iPod.plist
rm com.apple.iPod.plist

#Konvertieren der *.plist Datei in XML-Format
plutil -convert xml1 com.apple.iPod_bkp.plist

#Ändern des Werts Family-ID auf 10001
sed -e "s#<integer>[[:digit:]]*</integer>#<integer>10001</integer>#1"  com.apple.iPod_bkp.plist > com.apple.iPod.plist

#Konvertieren der neuen Datei ins Binairy Format
plutil -convert binary1 com.apple.iPod.plist

Die 1 am Ende hat auch nix gebracht!

Zitat

was hat OSX denn für ein LineEnding-Zeichen?

Was ich bisher rausgefunden habe, hat es das selbe wie jedes andere Unix auch, also müsste es ja kompatibel zu deinem System sein, oder nicht?!

lg,
Fabi
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0