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.