【问题标题】:sed regular expression to replace value with variable of same namesed 正则表达式用同名变量替换值
【发布时间】:2017-07-05 18:23:50
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 当shell扩展双引号内的字符串发送给sed时,它不知道sed会将\1解析成什么。
  • 使用合适的模板工具,而不是sed。

标签: regex linux bash awk sed


【解决方案1】:

使用 GNU awk 将第三个参数匹配():

$ 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!

【讨论】:

    【解决方案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'
    

    【讨论】:

    • 嗨@choroba,对于以下模式是否有任何修复..` {{var1}}:{{var2}}/{{var3}}` 它不匹配单个变量
    • @Pasha:更新:在+ 之后添加? 以使比赛更加节俭。
    猜你喜欢
    • 2019-11-11
    • 2021-12-31
    • 2018-08-22
    • 2013-08-25
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多