在YAML文件中的特定字符串后传递变量值

时间:2017-10-09 11:33:36

标签: linux bash awk sed yaml

我有一个Yaml格式的文件(如下所述)。

values.yml

replicaCount: 2
strategy: 
  type: RollingUpdate
  rollingUpdate:
     maxSurge: 1
     maxUnavailable: 1
minReadySeconds: 5
nodeSelector:
       role: nginxplus
image:
  repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops
  tag: foo
  pullPolicy: IfNotPresent

现在我想用另一个值替换key标记。价值来自变量。

例如,

 VAR=bar
 echo $VAR
 bar

我想要一些可以编辑我的values.yml文件并替换

的东西

tag:foo to tag:bar

由于

3 个答案:

答案 0 :(得分:1)

sed 方法:

var="bar"
sed -i "s/^\([[:space:]]*tag:[[:space:]]*\).*/\1$var/" values.yml

最终values.yml内容:

replicaCount: 2
strategy: 
  type: RollingUpdate
  rollingUpdate:
     maxSurge: 1
     maxUnavailable: 1
minReadySeconds: 5
nodeSelector:
       role: nginxplus
image:
  repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops
  tag: bar
  pullPolicy: IfNotPresent

答案 1 :(得分:1)

要做到这一点(是的,它会更改您的数据的表示,但它仍然是100%有效的YAML):

# This uses/requires the PyYAML library; "pip install PyYAML"
yaml2json() {
  python -c 'import yaml, json, sys; print json.dumps(yaml.safe_load(sys.stdin))'
}

editYaml() {
  local file=$1; shift
  local tempfile=$(mktemp "${file}.XXXXXX")
  local retval

  if jq "$@" < <(yaml2json <"$file") >"$tempfile"; then
    chmod --reference="$file" -- "$tempfile" # on GNU systems, preserve permissions
    mv -- "$tempfile" "$file"
  else
    retval=$?
    rm -f -- "$tempfile"
    return "$retval"
  fi
}

newTag=bar
editYaml values.yml --arg newTag "$newTag" '.image.tag = $newTag'

这种方法确保将相同的数据转换为相同的输出,无论它如何表示 - 至关重要,因为YAML提供了许多文本不同的方式来编写相同的语义内容。

答案 2 :(得分:0)

我使用perl和YAML::Tiny模块

cp values.yml values.yml.orig
perl -MYAML::Tiny -se '
    $file = shift @ARGV; 
    $yaml = YAML::Tiny->read($file); 
    $yaml->[0]{image}{tag} = $newtag; 
    $yaml->write($file);
' -- -newtag="bar" values.yml 
cat values.yml
---
image:
  pullPolicy: IfNotPresent
  repository: 2xxxxxxxxxxx6.dkr.ecr.us-east-1.amazonaws.com/miqp-devops
  tag: bar
minReadySeconds: '5'
nodeSelector:
  role: nginxplus
replicaCount: '2'
strategy:
  rollingUpdate:
    maxSurge: '1'
    maxUnavailable: '1'
  type: RollingUpdate