Использование сценария оболочки для замены токенов в файле - PullRequest
0 голосов
/ 09 июня 2018

У меня есть файл, который содержит переменные токена.Когда мы переключаем среды, мы хотим правильно заменить эти токены для среды, в которой мы находимся.

Как я могу сделать это в оболочке Linux?Я думаю, awk или sed.

Пример:

Файл содержит следующие данные:

DB_HOST=__HOST__
DB_PASSWORD=__PASSWORD__

Я хочу прочитать этот файл, распознать __HOST__ и заменитьэто с переменной окружения $(HOST).Мы получили бы имя переменной среды из совпавшей строки между двумя подчеркиваниями.

У кого-нибудь есть хорошая идея, как мы могли бы сделать это?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Программа 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, например, где исправлен замещающий текст.

0 голосов
/ 09 июня 2018

Это то, для чего m4 предназначено:

$ export HOST=myhost PASSWORD=mypassword

$ cat myfile
DB_HOST=__HOST__
DB_PASSWORD=__PASSWORD__

$ m4 -D __HOST__="$HOST" -D __PASSWORD__="$PASSWORD" myfile
DB_HOST=myhost
DB_PASSWORD=mypassword

Если вы хотите автоматически определять макросы для всех переменных среды, это, конечно, возможно, если немного сомнительно:

$ cat mymacros.m4
esyscmd(`env | sed -ne "s/^\([A-Z_]*\)=\(.*\)/define(__\1__, \`\2')/p" | tr -d "\n"')

$ cat myfile2
include(`mymacros.m4')
DB_HOST=__HOST__
DB_PASSWORD=__PASSWORD__
And other arbitrary text containing things like "My editor is __EDITOR__"

$ m4 myfile2
DB_HOST=myhost
DB_PASSWORD=mypassword
And other arbitrary text containing things like "My editor is vim"

Это не обязательно самый простой способ сделать это, но он очень гибкий и расширяемый, с поддержкой условных операторов, макрофункций и многого другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...