Como posso obter e alterar um valor de uma linha dentro de um arquivo se o valor dessa linha for desconhecido por mim?

0

O que estou tentando fazer é: Há um arquivo, dentro dele, há uma linha (certamente estará lá, 100%) neste modelo:

name_of_the_value=xxx

Onde o valor é numérico e desconhecido por mim porque muda entre o dispositivo e o dispositivo ... Eu preciso, de alguma forma, obter o valor de xxx e substituí-lo por outro valor dado pelo usuário através de um TextField (estou usando Java para isso, é para um aplicativo Android, mas é script de shell puro de qualquer maneira).

é válido:

  1. Encontre e exclua toda a linha e substitua por toda a linha, por exemplo exclua name_of_the_value=xxx e substitua por name_of_the_value=user_value
  2. Substitua somente a parte xxx (value)
  3. Comente com '#' quaisquer linhas correspondentes existentes e escreva a linha completa na parte inferior do arquivo

Mas como posso usar echo , sed ou awk se eu não souber o valor?

    
por Lennoard Silva 09.05.2016 / 12:51

1 resposta

3

Supondo que a parte para user_value tenha sempre 3 caracteres, você pode fazer assim:

sed "s/name_of_the_value=.{0,3}/name_of_the_value=$new_value/"

Ou se tiver certeza de que não há nada atrás nessa linha, você também pode usar:

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/"

Espero ter acertado o REGEX, não sou profissional nisso. Assim, o valor deve ser todo o tempo 3 caracteres de comprimento melhor no formato hexadecimal, porque decimal não é sempre 3 caracteres de comprimento em casos abaixo de 100. O segundo caso deve funcionar mesmo i o número está abaixo de 100, mas assume todo o name_of_the_value=user_value parte está em uma linha própria. Agora, testando isso no terminal, a saída se parece com isso para o segundo caso:

video@NAUTH:~$ echo "name_of_the_value=xxx" | sed "s/name_of_the_value=.*/name_of_the_value=$USER/"
name_of_the_value=video

É claro que você precisa enviar a saída de volta para o arquivo ou usar um arquivo temporário para trocar. Você poderia usar:

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file | sponge /input_file

Sed apenas altera a saída enquanto lê o arquivo, não o grava, a esponja salva a saída até que você termine e grave as alterações de volta.

Se você não quiser ou não puder usar esponja, escreva em um segundo arquivo e, em seguida, alterne-os como essa cadeia de comandos.

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file > /output_file
rm -v /input_file
mv -v /output_file /input_file

Como @kos apontou no comentário, você também pode usar o sinal -i do comando sed para gravar de volta no arquivo de entrada sem o uso de um arquivo temporário ou sponge :

sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file
    
por Videonauth 09.05.2016 / 13:49