читать переменные окружения из белого списка и канала в sed - PullRequest
1 голос
/ 21 января 2020

У меня есть файл белого списка переменных env, который выглядит следующим образом:

ENV_A
ENV_B
ENV_C

У меня есть другой файл filetoreplace.txt, который (скажем так) выглядит так:

asdfasdfasdfasdf{{ENV_A}}asdfasdfasdfasdfasdf

adsfasdf
asdf{{ENV_B}}
asdf{{ENV_A}}
adsfasdfdsfdf{{ENV_C}}

Я хочу придумать команду sed (в одну строку), которая читает имена переменных из файла и выполняет замену.

Для этой среды

ENV_A=1
ENV_B=2
ENV_C=3

Это будет вывод с учетом указанного выше файла

asdfasdfasdfasdf1asdfasdfasdfasdfasdf

adsfasdf
asdf2
asdf1
adsfasdfdsfdf3

Я думаю, что это примерно так:

< whitelist | while read var; do
  sed -i 's/{{'"$var"'}}/'${!var}'/g' filetoreplace.txt
done

Ищете немного кода в гольф, чтобы сделать это в один лайнер здесь

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Это относительно простое альтернативное решение:

#!/usr/bin/env bash

bash -c "source whitelist; cat << EOF
$(perl -pe 's/\{(\{.*?})}/\$$1/' filetoreplace.txt)
EOF
"

Цель сценария perl - преобразовать {{ENV_A}} в ${ENV_A}

0 голосов
/ 21 января 2020

Получил 2 непрактичных варианта, основанных на вашей идее с $ var \ $ {! Var}

Во-первых, obvy

vars=( $(cat whitelist) ); for var in ${vars[@]}; { sed "s|{{$var}}|${!var}|g" -i filetoreplace.txt; }

Во-вторых, чудовищно)

vars=( $(cat filetoreplace.txt) ); for var in ${vars[@]}; { env=${var//[!ENV_ABC]/}; [[ $env ]] && val=${!env} || var=; echo ${var//"{{$env}}"/$val}; }
...