#!/usr/bin/awk -f function evaluate (str) { for (j = 1; j <= length(str); j++) { if (substr(str, j, l_delimiters_begin) == var_delimiters_begin) { replacement = true k = "" j += l_delimiters_begin - 1 continue } if (substr(str, j, l_delimiters_end) == var_delimiters_end) { replacement = false str = gensub(var_delimiters_begin k var_delimiters_end, conf[name][apply_case_sensivity(k)], "g", str) j -= l_delimiters_end k continue } if (replacement) k = k substr(str, j, 1) } return dq gensub(dq, "\\\\" dq, "g", str) dq } function apply_case_sensivity (str) { if (case_sensitive) return str else { if (default_case == "lower") return tolower(str) else return toupper(str) } } function print_version () { printf("%s version %s\n", appname, version) } function help (rc) { print_version() if (rc != "") { print "CLI error: " rc exit 1 } exit 0 } BEGIN { # initialisation appname = ENVIRON["_"] version = "0.9" conf_arrays = "" filename = "" sections = "" dq = "\"" eol = ORS true = 1 false = 0 clean = false unset = false sectionlist = false case_sensitive = false default_case = "lower" var_delimiters_begin = "{{{" var_delimiters_end = "}}}" key_value_delimiter = "" in_var_space_remplacement = "" for (arg = 1; arg < ARGC; arg++) switch (ARGV[arg]) { case /^--conf=["']?.+["']?$/: filename = gensub(/^--conf=["']?(.+)["']?$/, "\\1", "", ARGV[arg]) break case "--sections-list": returnsectionlist = 1 break case /^--section=["']?.+["']?$/: s = gensub(/^--section=["']?(.+)["']?$/, "\\1", "", ARGV[arg]) onlysections[s] = true break case /^-s$/: s = gensub(/^["']?(.+)["']?$/, "\\1", "", ARGV[++arg]) onlysections[s] = true break case /^--clean$/: clean = true break case /^--unset$/: unset = true break case /^--compact$/: eol = ";" break case /^--array=["']?.+["']?$/: conf_arrays = conf_arrays "|" gensub(/^--array=["']?(.+)["']?$/, "\\1", "", ARGV[arg]) break case /^--var-delim-begin=["']?.{3,}["']?$/: var_delimiters_begin = gensub(/^--var-delim-begin=["']?(.{3,})["']?$/, "\\1", "", ARGV[arg]) break case /^--var-delim-end=["']?.{3,}["']?$/: var_delimiters_end = gensub(/^--var-delim-end=["']?(.{3,})["']?$/, "\\1", "", ARGV[arg]) break case /^--case-sensitive$/: case_sensitive = true break case /^--case-insensitive(|=lower|=UPPER)$/: case_sensitive = false default_case = gensub(/^--case-insensitive[=]?(.*)$/, "\\1", "", ARGV[arg]) if (default_case == "") default_case = "lower" break case /^--key-value-delimiter=["']?.["']?$/: key_value_delimiter = gensub(/^--key-value-delimiter=["']?(.)["']?$/, "\\1", "", ARGV[arg]) break case /^--in-var-space-replacement=["']?.["']?$/: in_var_space_remplacement = gensub(/^--in-var-space-replacement=["']?(.)["']?$/, "\\1", "", ARGV[arg]) break case /^help$/: help() break case /^version$/: print_version() exit default: help(ARGV[arg]) } if (filename == "" || (getline < filename) < 0 ) exit 1 close(filename) if (conf_arrays != "") { conf_arrays = gensub("^|", "", "", conf_arrays) if (key_value_delimiter != "") conf_arrays = gensub(/\s/, in_var_space_remplacement, "g", conf_arrays) conf_arrays = apply_case_sensivity(conf_arrays) } l_delimiters_begin = length(var_delimiters_begin) l_delimiters_end = length(var_delimiters_end) while ((getline < filename) == 1) { if (/^\s*(|#.*)$/) continue # section if (/^\s*\[.+\]\s*$/) { name=gensub(/^\s*\[(.+)\]\s*$/, "\\1", "g") for (key in key_array) ptr[name][key_array[key]] = 0 continue } # key (delimiter) value else if (name != "") { if (key_value_delimiter != "") { split($0, keyvalue, "[[:blank:]]*" key_value_delimiter "[[:blank:]]*") key = gensub(/\s/, in_var_space_remplacement, "g", keyvalue[1]) value = clean ? "" : keyvalue[2] #TODO: "join" toutes les valeurs } else { key = $1 value = clean ? "" : gensub("^[[:blank:]]*" $1 "[[:blank:]]*", "", "") } key = apply_case_sensivity(key) if (key ~ "^(" conf_arrays ")$" && ! unset) conf[name][key][++ptr[name][key]] = value else conf[name][key] = value } } if (returnsectionlist) for (name in conf) print name else for (name in onlysections) for (key in conf[name]) { if (key ~ "^(" conf_arrays ")$" && ! unset) for (i=1; i<=ptr[name][key]; i++) printf("%s[%i]=%s", key, i, evaluate(conf[name][key][i]) eol) else { if (unset) printf("unset %s", key, evaluate(conf[name][key]) eol) else printf("%s=%s", key, evaluate(conf[name][key]) eol) } } }