Lo que estoy tratando de hacer es: hay un archivo, dentro de él, hay una línea (seguramente estará allí, 100%) en este modelo:
name_of_the_value=xxx
donde esta el valornuméricoy desconocidopor mí porque cambia entre dispositivo y dispositivo... Necesito, de alguna manera, obtener el xxx
valor y reemplazarlo con otro valor dado por el usuario a través de TextField
(estoy usando Java para esto, es para una aplicación de Android, pero es script de shell puro de todos modos).
Es válida:
- Busque y elimine la línea completa y reemplácela con la línea completa, por ejemplo, elimínela
name_of_the_value=xxx
y reemplácela conname_of_the_value=user_value
- Reemplace solo la
xxx
pieza (valor) - Comente con '#' cualquier línea coincidente existente y escriba la línea completa al final del archivo.
¿ Pero cómo puedo usarlo echo
o si no sé el valor?sed
awk
Respuesta1
Suponiendo que la parte de valor_usuario siempre tiene 3 caracteres, puede hacerlo así:
sed "s/name_of_the_value=.{0,3}/name_of_the_value=$new_value/"
O si estás seguro de que no hay nada detrás en esa línea, también puedes usar:
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/"
Espero haber entendido bien REGEX, no soy un profesional en esto. Por lo tanto, el valor debe tener siempre 3 caracteres, mejor en formato hexadecimal porque el decimal no siempre tiene 3 caracteres en casos inferiores a 100. El segundo caso debería funcionar incluso si el número es inferior a 100, pero se supone que toda la name_of_the_value=user_value
parte está en formato hexadecimal. una línea propia. Ahora, probando esto en la terminal, el resultado se ve así para el 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
Por supuesto, debe canalizar la salida nuevamente al archivo o usar un archivo temporal para intercambiar. Podrías usar:
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file | sponge /input_file
Sed solo cambia la salida mientras lee el archivo, no lo escribe, la esponja guarda la salida hasta que termina y vuelve a escribir los cambios.
Si no quiere o no puede usar la esponja, escriba en un segundo archivo y luego cámbielos como esta cadena 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 señaló en el comentario, también puedes usar la -i
bandera del sed
comando para volver a escribir en el archivo de entrada sin el uso de un archivo temporal o sponge
:
sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file