9 votos

¿Cómo puedo reemplazar un valor en una matriz plist utilizando plutil?

Estoy tratando de cambiar un valor en un array usando plutil , pero me sale 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 un ejemplo de plist 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 de 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 del array 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 intento 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

1 votos

Esto parece ser un error. -extract obras y -insert falla con el esperado denuncia de la llave ya existente; mientras tanto -replace y -remove golpeó esta extraña cadena characterAtIndex: ¡cosa!

0 votos

Creo que la pregunta necesita una pequeña reformulación, ya que lo que intentas reemplazar NO es un "valor en un Array" porque el "valor" en el "array" es en realidad un Diccionario completo. Usted intenta reemplazar sólo la CLAVE del diccionario que está almacenada en el array

10voto

klanomath Puntos 19587

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 PARENT. El del segundo dict se modificaría con:

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

La opción -c ejecuta el comando directamente. El archivo no debe ser un plist binario.

0 votos

No es el mejor de los ejemplos. debe proporcionar un valor en el archivo plist ... luego mostrar cómo ese valor se sustituye por otro valor de mi elección. valor no significa clave.

0 votos

@momomo En mi ejemplo valorX sustituye a valor2 y valorY valor3 en el sample.plist de la OP.

0 votos

Ya veo, se refiere a las llaves. Lo que significa que no está reemplazando nada. Usted está estableciendo un valor para la clave.

3voto

liruqi Puntos 101
plutil -replace CFBundleDisplayName -string TestFlightX.com Info.plist

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X