2 votos

com.apple.xyz.plist - reemplazar valor - no establecer clave - ¿posible?

He mirado en el uso de PlistBuddy y plutil pero la mayoría de los ejemplos, tales como:

¿Cómo puedo reemplazar un valor en un plist matriz de uso de la plutil?

parecen sugerir ajuste el valor de una clave, que no es el caso aquí.

Quiero modificar un valor de I no sabe que existe o no. A ver, yo no sé cuál es la clave. Quiero automatizarlo.

Así que si usted puede buscar un valor, obtener el valor de y clave , a continuación, podría utilizar el de arriba para establecer un nuevo valor en la clave.

Pero no he encontrado una forma de hacerlo.

¿Sabe usted? Preferiblemente en Bash.

0 votos

¿Puede proporcionar una muestra de los datos de la lista de propiedades con la que va a trabajar y destacar dónde se encuentra el valor de interés?

0 votos

@CJK No, no puedo. El valor podría estar en 10-30 archivos y no puedo hacer ninguna suposición y en general me negaría a hacer soluciones en torno a un caso de uso particular, o entendido. En cualquier caso, ya lo he resuelto. Voy a publicar la respuesta más tarde aquí.

0 votos

Bien hecho por resolverlo. Para futuras referencias, los datos de muestra no se piden para adaptar una solución específicamente a un solo caso de uso. Se pide por una o varias de estas razones:

0voto

momo Puntos 101
######################################## BASH LIB #######################################
bash.string.replace() {
        local text="$1" find="$2" replace="$3";

        echo "${text}" | while IFS= read -r line; do 
                printf '%s\n' "${line//"$find"/$replace}"; 
        done 
}
######################################## BASH LIB #######################################

######################################## APPLE LIB ######################################
apple.plist.read() {
        local filepath="${1}"

        defaults read "${filepath}"                
}
apple.plist.convert.to.xml() {
        local filepath="${1}" tmp="${2}"

        # If second argument is passed, then we save the conversion to a new file rather than write over the original
        if [[ "${tmp}" == "true" ]]; then
            tmp="/tmp${filepath}"
        fi 

        if [[ "${tmp}" != "" ]]; then
            bash.cp "${filepath}" "${tmp}"

            filepath="${tmp}"
        fi

        plutil -convert xml1 "${filepath}"

        # We also output the content which can be supressed if desired by caller
        cat "${filepath}"                
}
apple.plist.convert.to.binary() {
        local filepath="${1}"

        plutil -convert binary1 "${filepath}"                
}
apple.plist.write() {
        local filepath="$1" text="$2"

        echo "${text}" > "${filepath}"

        apple.plist.convert.to.binary "${filepath}" # Not sure if this step is neccessary, if xml representation is enough. Not verified or tested without. 
}
apple.plist.read.search.replace.write() {
        local file="${1}" search="${2}" replacement="${3}"

        local updated=$(bash.string.replace "$(apple.plist.read "${file}")" "${search}" "${replacement}")

        apple.plist.write "${file}" "${updated}"
}
######################################## APPLE LIB ######################################

######################################## EXAMPLE ##################################
my.test.1() {
    apple.plist.read.search.replace.write "/tmp/com.apple.finder.plist" "/Users/" "/Home/"
}
######################################## EXAMPLE ##################################

Básicamente llamamos a la función plist.read.search.replace.write con los argumentos del archivo y lo que hay que reemplazar que lo leerá a texto, entonces realizamos un reemplazo en ese texto, y luego escribimos ese texto de vuelta usando plist.write que también lo convertirá de xml (que será) a binario utilizando plutil -convert xml1 "/path/to/file" .

En lugar de leer utilizando los valores predeterminados leer "..." podríamos en teoría instad utilizar plutil convertir a xml pero probablemente más caro.

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