2009-05-07 6 views
1

J'ai un petit script awk qui fait quelques modifications de fichiers sur place (dans un fichier Java .properties, pour vous donner une idée). Cela fait partie d'un script de déploiement affectant un groupe d'utilisateurs.awk: soit modifier ou ajouter une ligne, en fonction de son existence

Je souhaite pouvoir définir les paramètres par défaut, en laissant le reste du fichier dans les préférences de l'utilisateur. Cela signifie ajouter une ligne de configuration si elle est manquante, la modifier si elle est là, en laissant tout le reste tel quel.

Actuellement, j'utiliser 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 $0 
} 

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

Surtout quand le nombre de lignes que je veux contrôler devient plus grande, cela est de plus en plus lourd. Ma connaissance de awk n'est pas tout ce grand, et le dessus juste se sent mal - comment puis-je rationaliser cela?

P.S .: Si possible, j'aimerais rester avec awk. S'il vous plaît ne recommande pas simplement que l'utilisation de Perl/Python/tout serait beaucoup plus facile. :-)

+0

Ce que vous avez posté semble être awk, sed non. –

+0

J'étais tellement absorbé par l'écriture que je ne l'ai même pas remarqué. Corrigée. – Tomalak

+3

Perl/Python/Quoi de plus facile ;-) –

Répondre

4
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] 
    } 
} 
+0

* La solution *. L'ordre des clés par défaut est dépendant du hash, ainsi les clés finales non utilisées ne s'afficheront pas dans le même ordre que la déclaration, mais c'est un problème mineur. – richq

+0

@Sean Bright: Belle, merci. Question bonus: comment je regex-échapper la clé dans votre boucle for? Cela fonctionne maintenant, mais les points ne correspondent qu'en fait par accident. – Tomalak

+0

@Tomalak: Voir mon edit –

2

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

  • Initialiser un tableau avec les expressions et valeurs régulières.
  • Pour chaque ligne, parcourez le tableau et effectuez les substitutions appropriées. Nettoyer les entrées utilisées.
  • A la fin, parcourez le tableau et ajoutez des lignes pour les entrées restantes.
+0

Fondamentalement, c'est exactement ce que @Sean Bright a implémenté. +1 – Tomalak

Questions connexes