Как получить lua string match для разбора строки переменной окружения?


У меня есть парсер конфигурационных файлов, написанный на lua.

Я хотел бы обнаружить значения, которые являются переменными окружения, и изменить их с помощью ОС.функции getenv.

Это, вероятно, немного амбициозно, потому что у меня могут быть такие значения, как

"a string with an embedded ${VARIABLE} in here"

Или

"another string with an env $VARIABLE"

И я, вероятно, должен позволить экранировать их с помощью double $$, чтобы разрешить литерал $.

Как мне это сделать?

Это то, что у меня есть до сих пор, но это неправильно

local envvar = string.match(value, "%$([%w_]+)")
if envvar then
  print("Envvar=", envvar)
  value = value:gsub("(%$[%w_]+)", os.getenv(envvar))
end

Например, я не могу понять, как использовать %b опция баланса здесь для правильного подбора комбинаций { }. И сделать их необязательными. Как мне заставить это работать надежно?

На самом деле, я понимаю, что это, вероятно, сложнее, чем это. Что делать, если указано несколько переменных окружения?
1 2

1 ответ:

local text = [[
Example: ${LANG}, $TEXTDOMAINDIR, $$10.00, $$LANG, $UNDEFINED
Nested braces: {{${SHELL}}}
]]
text = text:gsub('$%$','\0')
           :gsub('${([%w_]+)}', os.getenv)
           :gsub('$([%w_]+)', os.getenv)
           :gsub('%z','$')
print(text)
--> Example: en_US.UTF-8, /usr/share/locale/, $10.00, $LANG, $UNDEFINED
--> Nested braces: {{/bin/bash}}