Pergunta

Eu tenho um script awk pequena que faz algumas modificações de arquivo no local (em um arquivo .properties Java, para lhe dar uma idéia). Isso faz parte de um script de implantação que afetam um grupo de usuários.

Eu quero ser capaz de definir padrões, deixando o resto do arquivo de preferências do usuário. Isto significa acrescentando uma linha de configuração se ele estiver ausente, modificá-lo se ele está lá, deixando tudo como está.

Atualmente eu uso algo como isto:

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

Especialmente quando o número de linhas que eu quero o controle fica maior, este é cada vez mais complicado. Meu conhecimento awk não é tão grande, e acima apenas sente errado - como posso simplificar isso?

P.S .: Se possível, eu gostaria de ficar com awk. Por favor, não apenas recomendar que o uso de Perl / Python / whatever seria muito mais fácil. : -)

Foi útil?

Solução

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

Outras dicas

Meu AWK está enferrujado, por isso não vou fornecer o código real.

  • inicializar uma matriz com as expressões e valores regulares.
  • Para cada linha, iterate a matriz e fazer substituições apropriadas. Limpar entradas utilizadas.
  • Na extremidade, as linhas da matriz de iteração e de anexação para entradas remanescentes.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top