我正在尝试替换yml文件中的一些变量。
Samepl.yml
spring:
metadataMap:
instanceId: ${spring.application.name}:${randomvalue}
client:
version: 1.0
myval: {{ myVal }}
我使用以下命令替换双括号内的所有值,例如:{{var}},其中包含相同名称的环境变量,即值:$ {var}如果变量未定义,它将失败。但没有运气
cat sample.yml | sed -e "s/{{ \(.*\) }}/${\1:?}/g" > /tmp/a
有什么建议吗?
答案 0 :(得分:2)
您可以使用Perl:
perl -pE 's:{{\s*(\S+?)\s*}}:$ENV{$1} // die "$1 not set":ge'
如果你的Perl早于5.10,你需要更详细:
perl -pe 's%{{\s*(\S+?)\s*}}%exists $ENV{$1} ? $ENV{$1} : die "$1 not set"%ge'
答案 1 :(得分:2)
使用GNU awk为第3个arg匹配():
$ myVal="foo" gawk 'match($0,/(.*{{\s*)(\S+)(\s*}}.*)/,a) && (a[2] in ENVIRON) { $0 = a[1] ENVIRON[a[2]] a[3] } 1' file
spring:
metadataMap:
instanceId: ${spring.application.name}:${randomvalue}
client:
version: 1.0
myval: {{ foo }}
$ other="foo" gawk 'match($0,/(.*{{\s*)(\S+)(\s*}}.*)/,a) && (a[2] in ENVIRON) { $0 = a[1] ENVIRON[a[2]] a[3] } 1' file
spring:
metadataMap:
instanceId: ${spring.application.name}:${randomvalue}
client:
version: 1.0
myval: {{ myVal }}
或者如果您愿意:
$ myVal="foo" gawk 'match($0,/(.*{{\s*)(\S+)(\s*}}.*)/,a) { if (a[2] in ENVIRON) { $0 = a[1] ENVIRON[a[2]] a[3]} else {print "the sky is falling!"; exit} } 1' file
spring:
metadataMap:
instanceId: ${spring.application.name}:${randomvalue}
client:
version: 1.0
myval: {{ foo }}
$ other="foo" gawk 'match($0,/(.*{{\s*)(\S+)(\s*}}.*)/,a) { if (a[2] in ENVIRON) { $0 = a[1] ENVIRON[a[2]] a[3]} else {print "the sky is falling!"; exit} } 1' file
spring:
metadataMap:
instanceId: ${spring.application.name}:${randomvalue}
client:
version: 1.0
the sky is falling!