2015-09-24 1 views
2

J'ai un analyseur de fichier de configuration écrit en lua.Comment obtenir lua string match pour analyser une chaîne de variable d'environnement?

Je voudrais détecter les valeurs qui sont des variables d'environnement et les modifier avec os.getenv.

Il est sans doute un peu ambitieux parce que je peux avoir des valeurs comme

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

ou

"another string with an env $VARIABLE" 

Et je laisserais sans doute leur échapper avec double $$ pour permettre à un $ littéral.

Comment faire?

C'est ce que j'ai jusqu'à présent, mais il ne convient pas

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

Par exemple, je ne peux pas comprendre comment utiliser l'option% b équilibre ici pour correspondre correctement {} combinaisons. Et les rendre facultatifs. Comment est-ce que je fais ce travail robuste?

En fait, je réalise que c'est probablement plus compliqué que ça. Que se passe-t-il si plus d'une variable d'environnement a été spécifiée?

Répondre

5
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}} 
+0

C'est parfait, merci tout un tas! – Matt