我有以下格式的yml文件。
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”那部分。
修改后的文件应该如下所示。
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发布于 2018-02-14 09:40:23
下面的awk可能对您同样有帮助:
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产出如下:
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变量,下面的内容可能会对此有所帮助:
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发布于 2018-02-14 18:59:54
这是你的解决办法。它基本上使用SED来进行替换。只需将“脚本的开始”和“脚本的结束”之间的位复制并粘贴到任何bash脚本中,然后运行(下面的简单说明):
剧本开始..。
#!/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_textEOF
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
注意:脚本也处理引号,也就是说,如果原始值有引号,那么新值也将被引号包围。
希望这有帮助..。
发布于 2018-02-14 10:14:22
Awk解决方案:
awk 'NF==1 && /^[^[:space:]]+:/{ f=(/^(Back|Front)endapp:/) }
f && $1 ~ /^Image(Tag)?:/{ $1=" teststring" }1' test.yml产出:
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: 2https://stackoverflow.com/questions/48783790
复制相似问题