Программа envsubst
была разработана примерно для этой цели, но она хочет использовать стандартный формат оболочки для строк, подлежащих замене из среды:
# Here-doc delimiter quoted to avoid having the shell do the substitutions
$ HOST=myhost PASSWORD=secret envsubst <<"EOF"
DB_HOST=$HOST
DB_PASSWORD=${PASSWORD}
EOF
DB_HOST=myhost
DB_PASSWORD=secret
envsubst
является частью Gnugettext, и широко доступен.Если вам действительно нужно использовать синтаксис __...__
, было бы легко изменить его на синтаксис envsubst
, отправив через sed:
$ cat myfile.txt
DB_HOST=__HOST__
DB_PASSWORD=__PASSWORD__
$ sed -E 's/__(([^_]|_[^_])*)__/${\1}/g' myfile.txt |envsubst
В качестве альтернативы, если у вас есть Python, есть очень простойрешение:
from sys import stdin
from os import getenv
import re
pattern = re.compile(r"__(\w*)__")
def replacer(m):
val = getenv(m[1])
if val is None:
# No such environment
# Perhaps produce a warning, or an error
# Here we just pass through the string unaltered
return m[0]
return val
print(pattern.sub(replacer, stdin.read()))
Пример:
$ export HOST=myhost PASSWORD=secret
$ python3 subst.py < myfile.txt
DB_HOST=myhost
DB_PASSWORD=secret
Ключом к этому решению является то, что Python (и, к сожалению, только несколько других языков) позволяет аргументу замены шаблона подстановки бытьфункция, которая затем вызывается при каждом последующем сопоставлении для создания замещающего текста.Это облегчает написание таких функций в Python, чем в awk, например, где исправлен замещающий текст.