remplacer en utilisant bash – valeur dynamic

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.