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. : -)

War es hilfreich?

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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top