Como posso automatizar a modificação de pares de chave / valor em um script de shell?

3

Eu geralmente quero automatizar esse tipo de tarefa em um script de shell:

se a linha:

SOMEKEY=SOMEVALUE

existe em um arquivo e depois muda para

SOMEKEY=SOMEOTHERVALUE

caso contrário, anexe a linha SOMEKEY=SOMEOTHERVALUE no arquivo.

Como eu poderia fazer isso? Acho que poderia fazer isso usando uma combinação de grep e sed , mas tenho certeza de que é uma tarefa bastante comum que alguém já tenha desenvolvido uma solução elegante.

A propósito, ao substituir eu normalmente faria algo assim

sed -i 's/old/new/g' fname

Mas isso significa que eu tenho que ter muito cuidado ao compor minhas expressões regulares, para não cometer erros. Existe uma maneira fácil de "visualizar" quais alterações que ocorreriam na minha chamada para sed sem realmente pisar no arquivo?

    
por wim 17.10.2011 / 13:27

1 resposta

1

Eu usaria o awk para essa tarefa:

   awk -F'=' -v "keyname=$SOMEKEY" -v "value=$SOMEOTHERVALUE" '
            $1 == keyname {
                    if ($2 != value) $2 = "\"" value "\""
                    key_found = 1
            }

            { print $1 "=" $2 }

            END { if (!key_found) print keyname "=\"" value "\"" }
   ' fname

assumindo

 SOMEKEY=key1
 SOMEOTHERVALUE="John Doe is dead!"

e com essa entrada:

 key1="John Doe is geat!
 key2="Who's John Wayne?"

Obtém-se:

 key1="John Doe is dead!"
 key2="Who's John Wayne?"

Ou se nenhuma linha key1 estiver presente, key1="John Doe is dead!" será anexado no final.

Observação: No Solaris ou em outros derivados do UNIX que ainda vêm uma versão antiga do awk (1) , nawk (1) deve ser usado em vez disso.

    
por 17.10.2011 / 13:58