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 xxx
valor 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:
- Encontre e exclua a linha inteira e substitua pela linha completa, por exemplo, exclua
name_of_the_value=xxx
e substitua porname_of_the_value=user_value
- Substitua apenas a
xxx
parte (valor) - Comente com '#' quaisquer linhas correspondentes existentes e escreva a linha completa no final do arquivo
Mas como posso usar echo
, sed
ou awk
se 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_value
parte 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 -i
sinalizador do sed
comando 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