Bash um liner para alterar os parâmetros de configuração

4

Eu tenho um arquivo de configuração com a seguinte estrutura.

ValueOne = 1
ValueTwo = 2
ValueThree = 3

Eu quero um script bash de um liner para encontrar ValueTwo e alterar o valor para 22222.

Alguma ideia? Não é coisa de escola

    
por TRA 16.07.2014 / 15:36

4 respostas

5

Eu aposto que haverá melhores, mas aqui vai:

Se o arquivo de configuração tiver parâmetros em sua própria linha

sed -i '/ValueTwo/s/= .*/= 22222/' config_file

Isto irá substituir o conteúdo do config_file no local. Para criar um novo arquivo com o parâmetro alterado, remova -i e coloque > new_file no final da linha.

Se o seu arquivo de configuração tiver parâmetros na mesma linha (como a pergunta não editada):

sed -i 's/ValueTwo = [^ ]*/ValueTwo = 22222/' config_file

Isso também substituirá o conteúdo do config_file no local. Ele funcionará enquanto não houver espaços no parâmetro ValueTwo. Isso também funcionará no caso de os parâmetros estarem em sua própria linha, mas o método anterior talvez seja mais robusto nesse caso.

    
por 16.07.2014 / 15:47
2
perl -p -i.bak -e 's/ValueTwo = 2/ValueTwo = 22222/' path/to/configfile

edita o arquivo no local e salva uma cópia do original em caso de problemas com os dedos. Você pode fazer o mesmo com o awk.

    
por 16.07.2014 / 15:45
1

Assumindo que ValueTwo é um número, sed fará muito bem:

sed -e 's/ValueTwo = [0-9]*/ValueTwo = 2222/g' your_config_file > output_file
    
por 16.07.2014 / 15:51
1

Eu escolheria awk :

awk '/ValueTwo/{$3=22222}1;' file > newfile

O item acima verifica se uma determinada linha corresponde a ValueTwo e define o campo 3d como 222 nas linhas correspondentes. O 1; é apenas uma maneira de escrever print $0 , ele irá imprimir cada linha. Como está fora do bloco de correspondências ( /ValueTwo/{} ), todas as linhas serão impressas.

Já que você pediu uma solução bash (não sei por que prefere uma, mas ainda assim), você pode tentar:

while read key eq val; do
    [ $key = "ValueTwo" ] && val=22222
    printf "%s %s %s\n" $key $eq $val
done <  file
    
por 16.07.2014 / 16:11