En jq, comment puis-je convertir un JSON en une chaîne avec key=value
?
De:
{
"var": 1,
"foo": "bar",
"x": "test"
}
À:
var=1
foo=bar
x=test
Tu pourrais essayer:
jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json
Voici une démo:
$ cat test.json
{
"var": 1,
"foo": "bar",
"x": "test"
}
$ jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json
foo=bar
var=1
x=test
Existe-t-il un moyen de le faire récursivement?
Voici une fonction qui pourrait faire ce que vous voulez:
# Denote the input of recursively_reduce(f) by $in.
# Let f be a filter such that for any object o, (o|f) is an array.
# If $in is an object, then return $in|f;
# if $in is a scalar, then return [];
# otherwise, collect the results of applying recursively_reduce(f)
# to each item in $in.
def recursively_reduce(f):
if type == "object" then f
Elif type == "array" then map( recursively_reduce(f) ) | add
else []
end;
Exemple: émettre des paires clé = valeur
def kv: to_entries | map("\(.key)=\(.value)");
[ {"a":1}, [[{"b":2, "c": 3}]] ] | recursively_reduce(kv)
#=> ["a=1","b=2","c=3"]
MISE À JOUR: Après la sortie de jq 1.5, walk/1 a été ajouté en tant que fonction intégrée définie par jq. Il peut être utilisé avec le kv défini ci-dessus, par ex. comme suit:
walk(if type == "object" then kv else . end)
Avec l'entrée ci-dessus, le résultat serait:
[["a = 1"], [[["b = 2", "c = 3"]]]]
Pour "aplatir" la sortie, aplatir/0 peut être utilisé. Voici un exemple complet:
jq -cr 'def kv: to_entries | map("\(.key)=\(.value)");
walk(if type == "object" then kv else . end) | flatten[]'
Contribution:
[ {"a":1}, [[{"b":2, "c": 3}]] ]
Production:
a=1
b=2
c=3
Soit dit en passant, s'appuyant sur l'excellente réponse de @ aioobe. Si vous avez besoin que les touches soient en majuscules, vous pouvez utiliser ascii_upcase
pour ce faire en modifiant son exemple:
jq -r 'to_entries|map("\(.key|ascii_upcase)=\(.value|tostring)")|.[]'
J'avais un scénario similaire au vôtre, mais je voulais mettre en majuscule toutes les clés lors de la création de variables d'environnement pour accéder à AWS.
$ okta-credential_process arn:aws:iam::1234567890123:role/myRole | \
jq -r 'to_entries|map("\(.key|ascii_upcase)=\(.value|tostring)")|.[]'
EXPIRATION=2019-08-30T16:46:55.307014Z
VERSION=1
SESSIONTOKEN=ABcdEFghIJ....
ACCESSKEYID=ABCDEFGHIJ.....
SECRETACCESSKEY=AbCdEfGhI.....
sans jq
, j'ai pu exporter chaque élément dans json en utilisant grep
et sed
mais cela ne fonctionnera pour les cas simples que lorsque nous avons des paires clé/valeur
for keyval in $(grep -E '": [^\{]' fileName.json | sed -e 's/: /=/' -e "s/\(\,\)$//"); do
echo "$keyval"
done
voici un exemple de réponse:
❯ for keyval in $(grep -E '": [^\{]' config.dev.json | sed -e 's/: /=/' -e "s/\(\,\)$//"); do
echo "$keyval"
done
"env"="dev"
"memory"=128
"role"=""
"region"="us-east-1"