Question

J'ai un petit script awk qui apporte des modifications au fichier sur place (dans un fichier Java .properties , pour vous donner une idée). Cela fait partie d'un script de déploiement qui affecte un groupe d'utilisateurs.

Je veux pouvoir définir les valeurs par défaut, en laissant le reste du fichier aux préférences de l'utilisateur. Cela signifie ajouter une ligne de configuration si elle manque, la modifier si elle est là, tout en laissant le reste tel quel.

Actuellement, j'utilise quelque chose comme ceci:

# 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 <*>
}

# append missing lines
END {
  if (some_value_set   == 0) print some_value_default
  if (other_value_set  == 0) print other_value_default
}

Surtout lorsque le nombre de lignes que je veux contrôler augmente, cela devient de plus en plus lourd. Ma connaissance de awk n’est pas très bonne, et ce qui précède se sent juste faux - comment puis-je simplifier cela?

P.S .: Si possible, j'aimerais rester avec awk. S'il vous plaît, ne recommandez pas simplement d'utiliser Perl / Python / tout ce qui serait beaucoup plus facile. : -)

Était-ce utile?

La solution

BEGIN {
    defaults["some.value"]  = "SOME VALUE"
    defaults["other.value"] = "OTHER VALUE"
}

{
    for (key in defaults) {
        pattern = key
        gsub(/\./, "\\.", pattern)
        if (match(<*>, "^" pattern "=.*")) {
            gsub(/=.*/, "=" defaults[key])
            delete defaults[key]
        }
    }
    print <*>
}

END {
    for (key in defaults) {
        print key "=" defaults[key]
    }
}

Autres conseils

Mon AWK est rouillé, je ne fournirai donc pas le code réel.

  • Initialisez un tableau avec les expressions régulières et les valeurs.
  • Pour chaque ligne, parcourez le tableau et effectuez les substitutions appropriées. Nettoyez les entrées utilisées.
  • À la fin, parcourez le tableau et ajoutez des lignes pour les entrées restantes.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top