Home > Mobile >  How can I replace the value inside a yaml file from another yaml file in bash
How can I replace the value inside a yaml file from another yaml file in bash

Time:03-08

I would like to replace a single value inside a yaml file (file1.yml) with the value of another yaml file (file2.yml). The key inside both file:

app:
  key: 12345

So far here is what I have done using sed with no success:

#!/bin/bash

old_value=`cat file1.yml | grep key | head -n1 | cut -f 2 -d ':'`
new_value=`cat file2.yml | grep key | head -n1 | cut -f 2 -d ':'`

sed "s/$old_value/$new_value/g;" file1.yml

I guess I should not be sending the standard output with sed and should be using awk.

CodePudding user response:

To manipulate yaml files, you should employ a yaml processor, like mikefarah/yq or kislyuk/yq.

Using mikefarah/yq:

new="$(yq '.key' file2.yml)" yq -i '.key = env(new)' file1.yml

Using kislyuk/yq:

yml="$(yq -y -s '.[0].key = .[1].key | .[0]' file1.yml file2.yml)"
cat <<< "$yml" > file1.yml

CodePudding user response:

Because in a yaml file the same value may exist in multiple places you want to use sed to perform a full search and then replace the value you are looking for; or use an specialized tool like yq (a jq wrapper)

For example, this yaml file is valid

app1:
  key: "1234"

app2:
  key: "1234"

with sed you will run the following to change key: "1234" to key: "5678" in just app2

sed '/^app2:/{n;s/key:.*/key: "5678"/;}' file.yaml

But doing the same using yq using in-place edit would look like:

 yq -i -y '.app2.key = "5678"' file.yml
  • Related