# Assign (Update) This operator is used to update node values. It can be used in either the: ### plain form: `=` Which will set the LHS node values equal to the RHS node values. The RHS expression is run against the matching nodes in the pipeline. ### relative form: `|=` This will do a similar thing to the plain form, but the RHS expression is run with _each LHS node as context_. This is useful for updating values based on old values, e.g. increment. ### Flags - `c` clobber custom tags ## Create yaml file Running ```bash yq --null-input '.a.b = "cat" | .x = "frog"' ``` will output ```yaml a: b: cat x: frog ``` ## Update node to be the child value Given a sample.yml file of: ```yaml a: b: g: foof ``` then ```bash yq '.a |= .b' sample.yml ``` will output ```yaml a: g: foof ``` ## Double elements in an array Given a sample.yml file of: ```yaml - 1 - 2 - 3 ``` then ```bash yq '.[] |= . * 2' sample.yml ``` will output ```yaml - 2 - 4 - 6 ``` ## Update node from another file Note this will also work when the second file is a scalar (string/number) Given a sample.yml file of: ```yaml a: apples ``` And another sample another.yml file of: ```yaml b: bob ``` then ```bash yq eval-all 'select(fileIndex==0).a = select(fileIndex==1) | select(fileIndex==0)' sample.yml another.yml ``` will output ```yaml a: b: bob ``` ## Update node to be the sibling value Given a sample.yml file of: ```yaml a: b: child b: sibling ``` then ```bash yq '.a = .b' sample.yml ``` will output ```yaml a: sibling b: sibling ``` ## Updated multiple paths Given a sample.yml file of: ```yaml a: fieldA b: fieldB c: fieldC ``` then ```bash yq '(.a, .c) = "potato"' sample.yml ``` will output ```yaml a: potato b: fieldB c: potato ``` ## Update string value Given a sample.yml file of: ```yaml a: b: apple ``` then ```bash yq '.a.b = "frog"' sample.yml ``` will output ```yaml a: b: frog ``` ## Update string value via |= Note there is no difference between `=` and `|=` when the RHS is a scalar Given a sample.yml file of: ```yaml a: b: apple ``` then ```bash yq '.a.b |= "frog"' sample.yml ``` will output ```yaml a: b: frog ``` ## Update deeply selected results Note that the LHS is wrapped in brackets! This is to ensure we don't first filter out the yaml and then update the snippet. Given a sample.yml file of: ```yaml a: b: apple c: cactus ``` then ```bash yq '(.a[] | select(. == "apple")) = "frog"' sample.yml ``` will output ```yaml a: b: frog c: cactus ``` ## Update array values Given a sample.yml file of: ```yaml - candy - apple - sandy ``` then ```bash yq '(.[] | select(. == "*andy")) = "bogs"' sample.yml ``` will output ```yaml - bogs - apple - bogs ``` ## Update empty object Given a sample.yml file of: ```yaml {} ``` then ```bash yq '.a.b |= "bogs"' sample.yml ``` will output ```yaml a: b: bogs ``` ## Update node value that has an anchor Anchor will remain Given a sample.yml file of: ```yaml a: &cool cat ``` then ```bash yq '.a = "dog"' sample.yml ``` will output ```yaml a: &cool dog ``` ## Update empty object and array Given a sample.yml file of: ```yaml {} ``` then ```bash yq '.a.b.[0] |= "bogs"' sample.yml ``` will output ```yaml a: b: - bogs ``` ## Custom types are maintained by default Given a sample.yml file of: ```yaml a: !cat meow b: !dog woof ``` then ```bash yq '.a = .b' sample.yml ``` will output ```yaml a: !cat woof b: !dog woof ``` ## Custom types: clobber Use the `c` option to clobber custom tags Given a sample.yml file of: ```yaml a: !cat meow b: !dog woof ``` then ```bash yq '.a =c .b' sample.yml ``` will output ```yaml a: !dog woof b: !dog woof ```