Domanda

Ho un piccolo script awk che apporta alcune modifiche al file sul posto (in un file Java .properties , per darti un'idea). Questo fa parte di uno script di distribuzione che interessa un gruppo di utenti.

Voglio essere in grado di impostare i valori predefiniti, lasciando il resto del file nelle preferenze dell'utente. Questo significa aggiungere una riga di configurazione se manca, modificarla se è presente, lasciando tutto il resto così com'è.

Attualmente uso qualcosa del genere:

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

Soprattutto quando il numero di linee che voglio controllare aumenta, diventa sempre più complicato. La mia imbarazzante conoscenza non è poi così eccezionale e quanto sopra sembra sbagliato - come posso semplificare questo?

P.S .: Se possibile, mi piacerebbe stare con Awk. Per favore, non limitarti a raccomandare che usare Perl / Python / qualunque cosa sia molto più semplice. : -)

È stato utile?

Soluzione

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]
    }
}

Altri suggerimenti

Il mio AWK è arrugginito, quindi non fornirò il codice effettivo.

  • Inizializza un array con le espressioni e i valori regolari.
  • Per ogni riga, itera l'array e fai le sostituzioni appropriate. Elimina le voci utilizzate.
  • Alla fine, itera l'array e aggiungi le righe per le voci rimanenti.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top