sed正则表达式用同名变量替换值

时间:2017-07-05 18:23:51

标签: regex linux bash awk sed

我正在尝试替换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

有什么建议吗?

2 个答案:

答案 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!