Wie ersetze ich einen Wert in einem plist-Array mit plutil?

6

Ich versuche, einen Wert in einem Array mit zu ändern plutil, erhalte jedoch den Fehler

Failed to insert value new value 2 at key path PARENT.0.KEY_IN_ARRAY with error -[__NSCFConstantString characterAtIndex:]: Range or index out of bounds

Hier ist eine Beispielliste, um das Problem zu veranschaulichen:

<?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>SIMPLE</key>
  <string>value1</string>
  <key>PARENT</key>
  <array>
    <dict>
      <key>KEY_IN_ARRAY</key>
      <string>value2</string>
    </dict>
    <dict>
      <key>KEY_IN_ARRAY</key>
      <string>value3</string>
    </dict>
  </array>
</dict>
</plist>

Das Ändern des SIMPLE-Werts ist einfach:

$ plutil -extract SIMPLE xml1 -o - sample.plist 
<?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">
<string>value1</string>
</plist>

$ plutil -replace SIMPLE -string "new value 1" sample.plist 

$ plutil -extract SIMPLE xml1 -o - sample.plist 
<?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">
<string>new value 1</string>
</plist>

Das Abrufen des Array-Werts funktioniert einwandfrei:

$ plutil -extract PARENT.0.KEY_IN_ARRAY xml1 -o - sample.plist 
<?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">
<string>value2</string>
</plist>

Ich erhalte jedoch die Fehlermeldung, wenn ich versuche, diesen Wert zu ändern:

$ plutil -replace PARENT.0.KEY_IN_ARRAY -string "new value 2" sample.plist 
sample.plist: Could not modify plist, error: Failed to insert value new 
value 2 at key path PARENT.0.KEY_IN_ARRAY with error -[__NSCFConstantString 
characterAtIndex:]: Range or index out of bounds
Gregmac
quelle
1
Dies scheint ein Fehler zu sein. -extractfunktioniert und -insertscheitert mit der erwarteten Beschwerde über den bereits vorhandenen Schlüssel; In der Zwischenzeit -replaceund -removeschlagen Sie diese seltsame characterAtIndex:Saitensache!
Natevw

Antworten:

7

Ich denke, PlistBuddy ist hier das empfohlene Tool:

/usr/libexec/PlistBuddy -c "Set :PARENT:0:KEY_IN_ARRAY valueX" sample.plist 

Der Befehl ändert den Wert von KEY_IN_ARRAY im ersten Diktat von PARENT. Das im zweiten Diktat würde geändert werden mit:

/usr/libexec/PlistBuddy -c "Set :PARENT:1:KEY_IN_ARRAY valueY" sample.plist 

Der Schalter -c führt den Befehl direkt aus. Die Datei darf keine Binärliste sein!

Klanomath
quelle
nicht die besten Beispiele. sollte einen Wert in der plist-Datei angeben ... dann zeigen, wie dieser Wert durch einen anderen Wert meiner Wahl ersetzt wird. Wert ohne Bedeutung Schlüssel.
mmm
@momomo In meinem Beispiel ValueX ersetzt Wert2 und valueY value3 in th sample.plist des OP!
Klanomath
Ich verstehe, Sie beziehen sich auf Schlüssel. Das heißt, Sie ersetzen nichts. Sie legen einen Wert für den Schlüssel fest.
mmm