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

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!


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.