首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Bash替换yml中的行值

用Bash替换yml中的行值
EN

Stack Overflow用户
提问于 2018-02-14 09:35:34
回答 3查看 3.4K关注 0票数 1

我有以下格式的yml文件。

代码语言:javascript
复制
Backendapp:
  Name: spring-rest 
  Image: "testuser/backend"
  ImageTag: "latest"
  ImagePullPolicy: "Always"
  Port: 8080
  replicaCount: 2

Frontendapp:
  Name: spring-js
  Image: "testuser/frontend"
  ImageTag: "latest"
  ImagePullPolicy: "Always"
  replicaCount: 2

如何通过Bash替换Backendapp的“图像”、“ImageTag”?

编辑:假设文件名是test.yml,上面的内容。然后,我想用另一个值(比如'teststring','latest2‘resp)替换'Image’和‘latest2’。因为“Backendapp”那部分。

修改后的文件应该如下所示。

代码语言:javascript
复制
Backendapp:
  Name: spring-rest 
  Image: "teststring"
  ImageTag: "latest2"
  ImagePullPolicy: "Always"
  Port: 8080
  replicaCount: 2

Frontendapp:
  Name: spring-js
  Image: "testuser/frontend"
  ImageTag: "latest"
  ImagePullPolicy: "Always"
  replicaCount: 2
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-14 09:40:23

下面的awk可能对您同样有帮助:

代码语言:javascript
复制
awk '
/:$/{
  flag=""
}
/Backendapp/||/Frontendapp/{
  flag=1
}
flag && NF && (/Image:/||/ImageTag:/){
  match($0,/^[[:space:]]+/);
  val=substr($0,RSTART,RLENGTH);
  $NF="teststring";
  print val $0;
  next
}
1
'   Input_file

产出如下:

代码语言:javascript
复制
Backendapp:
  Name: spring-rest
  Image: teststring
  ImageTag: teststring
  ImagePullPolicy: "Always"
  Port: 8080
  replicaCount: 2

Frontendapp:
  Name: spring-js
  Image: teststring
  ImageTag: teststring
  ImagePullPolicy: "Always"
  replicaCount: 2

解决方案2:按照OP,OP也需要将变量转换为awk变量,下面的内容可能会对此有所帮助:

代码语言:javascript
复制
awk -v val_shell="$shell_variable" '
/:$/{
  flag=""
}
/Backendapp/||/Frontendapp/{
  flag=1
}
flag && NF && (/Image:/||/ImageTag:/){
  match($0,/^[[:space:]]+/);
  val=substr($0,RSTART,RLENGTH);
  $NF=val_shell;
  print val $0;
  next
}
1
'   Input_file
票数 2
EN

Stack Overflow用户

发布于 2018-02-14 18:59:54

这是你的解决办法。它基本上使用SED来进行替换。只需将“脚本的开始”和“脚本的结束”之间的位复制并粘贴到任何bash脚本中,然后运行(下面的简单说明):

剧本开始..。

代码语言:javascript
复制
#!/bin/bash

# SED script will be stored here ...

sedscript=/tmp/sedscript.sed

# first argument to script is the parent name ...

parent="${1}"

# second argument to the script is child name...

child="${2}"

# third argument is the value to replace the CHILD value with ...

value="$3"

cat << EOF > "${sedscript}"

# find parent ...
/^${parent}:.*$/{

    p

    # load next line into input ...
    n

    # another parent found to print it ...
    /^[a-z|A-Z|0-9]\{1\}:.*$/{

        # we have found another parent
        # so stop processing ...

        b print_default_text
    }

    :search_for_child

    /^[ |   ]*$child[ | ]*:.*$/{

        s/^\([^:]*:[ |\"|   ]*\)[^\"]*\(.*\)$/\1$value\2/p

        b dont_print_default_text
    }

    p
    n
    b search_for_child
}


:print_default_text
p

:dont_print_default_text

EOF

代码语言:javascript
复制
sed -n -f "${sedscript}" "input.yml"

..。脚本结束

现在,我们将脚本保存为alter.sh (例如),然后像这样运行它(将Frontendapp/Image更改为“另一个图像名称”):

“另一个-图像-名称”

输入文件..。

Backendapp: Name: spring映像:"teststring“ImageTag:"latest2”ImagePullPolicy:“Name”端口: 8080 replicaCount: 2

Frontendapp:名称:spring:“testuser/前端”ImageTag:最新的“ImagePullPolicy:”总是“replicaCount: 2”

输出文件..。

Backendapp: Name: spring映像:"teststring“ImageTag:"latest2”ImagePullPolicy:“Name”端口: 8080 replicaCount: 2

Frontendapp:名称:spring图像:“另一个图像名称”ImageTag:“最新的”ImagePullPolicy:“总是”replicaCount: 2

注意:脚本也处理引号,也就是说,如果原始值有引号,那么新值也将被引号包围。

希望这有帮助..。

票数 2
EN

Stack Overflow用户

发布于 2018-02-14 10:14:22

Awk解决方案:

代码语言:javascript
复制
awk 'NF==1 && /^[^[:space:]]+:/{ f=(/^(Back|Front)endapp:/) }
     f && $1 ~ /^Image(Tag)?:/{ $1="  teststring" }1' test.yml

产出:

代码语言:javascript
复制
Backendapp:
  Name: spring-rest
  teststring: "testuser/backend"
  teststring: "latest"
  ImagePullPolicy: "Always"
  Port: 8080
  replicaCount: 2

Frontendapp:
  Name: spring-js
  teststring: "testuser/frontend"
  teststring: "latest"
  ImagePullPolicy: "Always"
  replicaCount: 2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48783790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档