Saltar al contenido

Modificar un valor-clave en un json usando jq in situ

Solución:

Utilice un archivo temporal; es lo que hace cualquier programa que pretenda realizar ediciones in situ.

tmp=$(mktemp)
jq '.address = "abcde"' test.json > "$tmp" && mv "$tmp" test.json

Si la dirección no está codificada, pase la dirección correcta a través de un jq argumento:

address=abcde
jq --arg a "$address" '.address = $a' test.json > "$tmp" && mv "$tmp" test.json

hasta donde se jq no admite la edición en el lugar, por lo que primero debe redirigir a un archivo temporal y luego reemplazar su archivo original con él, o utilizar sponge utilidad del paquete moreutils, así:

jq '.address = "abcde"' test.json|sponge test.json

Existen otras técnicas para “redirigir al mismo archivo”, como guardar su salida en una variable, etc. “Unix & Linux StackExchange” es un buen lugar para comenzar, si desea obtener más información sobre esto.

Los archivos temporales añaden más complejidad cuando no son necesarios (a menos que realmente esté tratando con archivos JSON tan grandes que no pueda caberlos en la memoria (GB a cientos de GB o TB, dependiendo de cuánta RAM / paralelismo tenga)

La forma de Pure bash.

contents="$(jq '.address = "abcde"' test.json)" && 
echo "${contents}" > test.json

Pros

  • Sin archivo temporal para hacer malabares
  • Bash puro
  • No necesita un administrador para instalar sponge, que no está instalado por defecto
  • Más simple

Nota: esto no se puede combinar como “un comando”, ya que antes de cuando el comando comienza a ejecutarse, se inicia la redirección y vacía el archivo, por lo tanto, dos comandos separados.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *