Diese assoziative Array Gegeben:Recursively Ersatz auf eine Variable
declare -A variables=(
[prefix]='/usr'
[exec_prefix]='@[email protected]'
[libdir]='@[email protected]/lib'
)
Ich möchte jedes Auftreten des Musters (wobei die Einfang zB @[email protected]
mit prefix
) @([^@/]+)@
ersetzen mit dem Wert, der der Erfassung zugeordnet ist (zB /usr
für prefix
) in allen seinen Werten, so dass die Substitution rekursiv durchgeführt wird, bis keine Vorkommen mehr auftreten. Die Schritte für jeden Schlüssel im Array wären:
- Rufen Sie den zugehörigen Wert ab und führen Sie (2) darauf aus.
- Überprüfen Sie, ob das Muster in der angegebenen Zeichenfolge übereinstimmt.
- Wenn es keine gibt, geben Sie die angegebene Zeichenfolge zurück.
- Wenn es ein Spiel:
- Perform (1) auf der Erfassung und das Ergebnis halten.
- Ersetzen Sie die Übereinstimmung durch das Ergebnis.
- Führen Sie (2) für die resultierende Zeichenfolge aus.
- Tropfen der vorherige Wert zugeordnet auf den Schlüssel und Mitarbeiter, um es der letzte String zurückgegeben.
Was auch immer der Ansatz, das gewünschte Ergebnis ist:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
Zusätzliche Anforderungen:
- Selbstreferenzen (beispielsweise
[email protected]@
) findet nicht statt. - Verwenden Sie nach Möglichkeit nur Bash-Dateien.
Beispiel in Lua:
local variables={
prefix="/usr",
exec_prefix="@[email protected]",
includedir="@[email protected]/include",
libdir="@[email protected]/lib",
random_one_to_show_off_fancy_recursion="@[email protected]@[email protected]@[email protected]"
}
function replacer(variable)
return compute_value(variables[variable])
end
function compute_value(s)
return s:gsub('@([^@/]+)@',replacer)
end
local variable, value = next(variables)
while variable do
variables[variable] = compute_value(value)
print(string.format('%-39s\t%s', variable, variables[variable]))
variable, value = next(variables,variable)
end
Sie haben entweder eine Shell-Lösung überbeansprucht oder suchen kostenlose Beratung. ;-). Was haben Sie versucht, Ihr Problem zu lösen? Vielleicht möchten Sie dafür eine 100-Punkte-Prämie anbieten? Viel Glück. – shellter
Muss dies rekursiv durchgeführt werden? Wofür ist das? – Laurel
@shillter Definitiv keine kostenlose Beratung! Ich habe nichts von dem gepostet, was ich versucht habe, weil es wirklich kompliziert war. Für die Aufzeichnung habe ich verschiedene Ansätze ausprobiert, die 'eval' beinhalten und mehrere Probleme betreffen, hauptsächlich die Expansionsreihenfolge (zum Beispiel sollte' libdir' nicht vor 'exec_prefix' bewertet werden). Ich bin mit einem Lua-Skript gelandet, aus dem ich das obige Beispiel extrahiert habe, aber ich möchte Lua nicht zu einer Anforderung für Benutzer machen. – Kalrish