我有一个如下文件,键值对由=
分隔。我已经将一些变量导出到我的shell中。现在我想要一个shell脚本,如果这些键已经存在于env变量中或导出到shell,它可以用值替换相应的键。
我本可以使用envsubst,但我不想在美元符号前面加上这些默认值。如果有任何其他工具,比如envsubst,可以帮助我替换字符串值,请参阅。
foo.yaml
PROJECT_NAME=test
DOMAIN_NAME=test.localhost
NETWORK_NAME=traefik-network
ENVIRONMENT=dev
DRUPAL_VERSION=8
MYSQL_HOSTNAME=test.mariadb
MYSQL_DATABASE=drupal
MYSQL_USER=test
MYSQL_PASSWORD=pass
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=pass
我认为,您正在寻找以下内容。
> cat foo.yaml
PROJECT_NAME=test
DOMAIN_NAME=test.localhost
NETWORK_NAME=traefik-network
ENVIRONMENT=dev
DRUPAL_VERSION=8
MYSQL_HOSTNAME=test.mariadb
MYSQL_DATABASE=drupal
MYSQL_USER=test
MYSQL_PASSWORD=pass
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=pass
>
> export ENVIRONMENT=sit
> export DRUPAL_VERSION=10
> export MYSQL_PASSWORD="*****"
>
> perl -lpe ' s/(.*)=(.*)/sprintf("%s=%s","$1",$ENV{$1}? $ENV{$1}:$2)/ge ' foo.yaml
PROJECT_NAME=test
DOMAIN_NAME=test.localhost
NETWORK_NAME=traefik-network
ENVIRONMENT=sit
DRUPAL_VERSION=10
MYSQL_HOSTNAME=test.mariadb
MYSQL_DATABASE=drupal
MYSQL_USER=test
MYSQL_PASSWORD=*****
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=pass
>
这有帮助吗?。
注意,如果您有写权限,您可以在Perl中使用-i开关来覆盖文件
> perl -i -lpe ' s/(.*)=(.*)/sprintf("%s=%s","$1",$ENV{$1}? $ENV{$1}:$2)/ge ' foo.yaml
> cat foo.yaml
PROJECT_NAME=test
DOMAIN_NAME=test.localhost
NETWORK_NAME=traefik-network
ENVIRONMENT=sit
DRUPAL_VERSION=10
MYSQL_HOSTNAME=test.mariadb
MYSQL_DATABASE=drupal
MYSQL_USER=test
MYSQL_PASSWORD=*****
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=pass
>
AWK士兵。
> awk -F"=" ' { $2=ENVIRON[$1]?ENVIRON[$1]:$2; printf("%s=%sn",$1,$2) } ' foo.yaml
可以进一步缩短为
> awk -F"=" ' { printf("%s=%sn",$1,ENVIRON[$1]?ENVIRON[$1]:$2) } ' foo.yaml
处理空白行
> awk -F"=" ' { if (!/^s*$/) $0=sprintf("%s=%s",$1,ENVIRON[$1]?ENVIRON[$1]:$2) }1 ' foo.yaml