簡體   English   中英

sed正則表達式用同名變量替換值

[英]sed regular expression to replace value with variable of same name

我正在嘗試替換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

有什么建議么?

您可以為此使用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'

使用GNU awk作為第三個參數match():

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM