awk: modifica o aggiungi una riga, in base alla sua esistenza
-
08-07-2019 - |
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. : -)
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.