¿Cómo reemplazo un valor en una matriz plist usando plutil?

Estoy tratando de cambiar un valor en una matriz usando plutil, pero aparece el 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

Aquí hay una plist de muestra para ilustrar el problema:

<?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>

Modificar el valor SIMPLE es fácil:

$ 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>

Obtener el valor de la matriz funciona bien:

$ 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>

pero me sale el error cuando trato de modificar este valor:

$ 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
Esto parece ser un error. -extractfunciona y -insertfalla con la queja esperada de la clave ya existente; mientras tanto , ¡ -replacey -removegolpea esta extraña cuerda characterAtIndex:!
Creo que la pregunta necesita una pequeña reformulación, ya que lo que intenta reemplazar NO es un "valor en una matriz" porque el "valor" en la "matriz" es en realidad un diccionario completo. Intenta reemplazar solo la CLAVE en el diccionario que está almacenada en la matriz

Respuestas (2)

Creo que PlistBuddy es la herramienta recomendada aquí:

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

El comando modifica el valor de KEY_IN_ARRAY en el primer dict de PADRE. El que está en el segundo dict se cambiaría con:

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

El modificador -c ejecuta el comando directamente. ¡El archivo no debe ser un plist binario!

no es el mejor de los ejemplos. debería proporcionar un valor en el archivo plist ... luego mostrar cómo ese valor se reemplaza con otro valor de mi elección. valor que no significa clave.
@momomo En mi ejemplo , valueX reemplaza value2 y valueY value3 en el sample.plist de OP.
Ya veo, te refieres a llaves. Lo que significa que no estás reemplazando nada. Está configurando un valor para la clave.
plutil -replace CFBundleDisplayName -string TestFlightX.com Info.plist