J’ai un fichier Json qui a les valeurs suivantes
cat file { "key1": "value1" "key2": "value2", }
Je voudrais changer la valeur1 et la valeur2. Les valeurs sont dynamics, elles changent les heures supplémentaires. Mon sed devrait fonctionner avec n’importe quelle valeur et mylook up devrait être par clé. “ma commande sed ne m’aide pas.
sed -i 's/*\"key2\":*/\"key2\": "someothervalue2"/' file
Vous devriez utiliser un parsingur jq
approprié au lieu de sed
, par exemple jq
.
dans le fichier
{ "key1" : "value1", "key2" : "value2" }
Vous pouvez remplacer ses valeurs comme ceci:
jq '.key1 = "foo" | .key2 = "bar"' < infile
Sortie:
{ "key1": "foo", "key2": "bar" }
Vous semblez un peu familier avec les regex, il y a quelques problèmes dans votre expression. Par exemple, pour correspondre à n’importe quel caractère que vous utilisez .
puis ajoutez l’écanvas ( .*
) pour qu’elle corresponde à 0 ou plusieurs fois. Vous devriez prendre le temps de vous familiariser avec regex car cela vous permettra d’économiser du temps et des problèmes à l’avenir.
Mais pour obtenir le résultat souhaité, j’ai utilisé cette commande:
sed -i -r 's/("key2" ?= ?).*,?/\1"someothervalue2",/' file
Vous devriez mettre ceci dans un script si vous allez le faire beaucoup pour que vous puissiez simplement taper la ./myScript key new_value file
Essayez avec la solution awk trop une fois.
awk '$1 ~ /key[12]/{match($0,/^ +/);printf substr($0,RSTART,RLENGTH);sub(/value[0-9]+/,"someothervalue2",$3);printf("%s%s",$0,RS);next} 1' Input_file
OU
awk ' $1 ~ /key[12]/{ match($0,/^ +/); printf substr($0,RSTART,RLENGTH); sub(/value[0-9]+/,"someothervalue2",$3); printf("%s%s",$0,RS); next } 1 ' Input_file
La sortie sera la suivante:
{ "key1" = "someothervalue2" "key2" = "someothervalue2", }
Si vous avez plus que key1 et key2 dans votre Input_file, changez la clé [12] à la clé [0-9] + et dites-nous comment ça se passe.