Pregunta

Tengo un pequeño script awk que realiza algunas modificaciones de archivos en el lugar (a un archivo .properties de Java, para darle una idea). Esto es parte de un script de implementación que afecta a un grupo de usuarios.

Deseo poder establecer valores predeterminados, dejando el resto del archivo a las preferencias del usuario. Esto significa agregar una línea de configuración si falta, modificarla si está allí, dejando todo lo demás como está.

Actualmente uso algo como esto:

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

Especialmente cuando el número de líneas que quiero controlar aumenta, esto es cada vez más engorroso. Mi conocimiento no es tan bueno, y lo anterior simplemente se siente mal, ¿cómo puedo racionalizar esto?

P.S .: Si es posible, me gustaría quedarme con awk. No solo recomiende que usar Perl / Python / lo que sea sea mucho más fácil. :-)

¿Fue útil?

Solución

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

Otros consejos

Mi AWK está oxidado, por lo que no proporcionaré el código real.

  • Inicialice una matriz con las expresiones y valores regulares.
  • Para cada línea, itere la matriz y realice las sustituciones apropiadas. Limpie las entradas usadas.
  • Al final, itera la matriz y agrega líneas para las entradas restantes.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top