awk: Entweder ändern oder eine Zeile anzuhängen, auf der Grundlage seiner Existenz
-
08-07-2019 - |
Frage
Ich habe einen kleinen awk-Skript, das einige in-Place-Dateiänderungen tut (in Java .properties
Datei, die Sie gebe eine Vorstellung). Dies ist Teil einer Deployment-Skript eine Reihe von Benutzern zu beeinflussen.
Ich möchte in der Lage seinen Standardwert zu setzen, um den Rest der Datei auf den Präferenzen des Benutzers zu verlassen. Dies bedeutet eine Konfigurationszeile angehängt, wenn sie fehlt, es zu ändern, wenn es da ist, alles zu verlassen sonst wie es ist.
Zur Zeit verwende ich etwas wie folgt aus:
# initialize
BEGIN {
some_value_set = 0
other_value_set = 0
some_value_default = "some.value=SOME VALUE"
other_value_default = "other.value=OTHER VALUE"
}
# modify existing lines
{
if (/^some\.value=.*/)
{
gsub(/.*/, some_value_default)
some_value_set = 1
}
else if (/^other\.value=.*/)
{
gsub(/.*/, other_value_default)
other_value_set = 1
}
print $0
}
# append missing lines
END {
if (some_value_set == 0) print some_value_default
if (other_value_set == 0) print other_value_default
}
Vor allem, wenn die Anzahl der Zeilen, die ich steuern mag größer wird, ist dies zunehmend beschwerlich. Mein awk Wissen ist nicht so toll, und die oben nur fühlt falsch - wie kann ich das optimieren?
P. S .: Wenn möglich, möchte ich mit awk bleiben. Bitte empfehlen nicht nur, dass Perl / Python / was auch immer viel einfacher wäre. : -)
Lösung
BEGIN {
defaults["some.value"] = "SOME VALUE"
defaults["other.value"] = "OTHER VALUE"
}
{
for (key in defaults) {
pattern = key
gsub(/\./, "\\.", pattern)
if (match($0, "^" pattern "=.*")) {
gsub(/=.*/, "=" defaults[key])
delete defaults[key]
}
}
print $0
}
END {
for (key in defaults) {
print key "=" defaults[key]
}
}
Andere Tipps
Meine AWK ist rostig, so dass ich nicht unbedingt Code liefern.
- initialisieren ein Array mit den regulären Ausdrücken und Werten.
- Für jede Zeile durchläuft das Array und tut geeignete Substitutionen. Reinigen Sie verwendeten Einträge.
- Am Ende, das Array iterieren und fügen Sie Zeilen für Einträge bleiben.