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

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

O que estou tentando fazer é: Tem um arquivo, dentro dele, tem uma linha (com certeza estará lá, 100%) neste modelo:

name_of_the_value=xxx

Onde está o valornuméricoe desconhecidopor mim porque muda entre dispositivo e dispositivo... Preciso, de alguma forma, pegar o xxxvalor e substituí-lo por outro valor fornecido pelo usuário via a TextField(estou usando Java para isso, é para uma aplicação Android, mas é script de shell puro de qualquer maneira).

É válido:

  1. Encontre e exclua a linha inteira e substitua pela linha completa, por exemplo, exclua name_of_the_value=xxxe substitua porname_of_the_value=user_value
  2. Substitua apenas a xxxparte (valor)
  3. Comente com '#' quaisquer linhas correspondentes existentes e escreva a linha completa no final do arquivo

Mas como posso usar echo, sedou awkse não sei o valor?

Responder1

Supondo que a parte de 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 você tiver certeza de que não há nada por trás dessa linha, você também pode usar:

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

Espero ter acertado no REGEX, não sou profissional nisso. Portanto, o valor deve ter sempre 3 caracteres, melhor no formato hexadecimal, porque decimal nem sempre tem 3 caracteres em casos abaixo de 100. O segundo caso deve funcionar mesmo que o número esteja abaixo de 100, mas assume que a name_of_the_value=user_valueparte inteira está em uma linha própria. Agora testando isso no terminal, a saída fica assim 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 canalizar 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, o Sponge salva a saída até você terminar e grava as alterações de volta.

Se você não quiser ou não puder usar o Sponge, escreva em um segundo arquivo e depois troque-os como esta 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 -isinalizador do sedcomando para gravar novamente 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

informação relacionada