¿Cómo puedo obtener y cambiar el valor de una línea dentro de un archivo si desconozco el valor de dicha línea?

¿Cómo puedo obtener y cambiar el valor de una línea dentro de un archivo si desconozco el valor de dicha línea?

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 xxxvalor 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:

  1. Busque y elimine la línea completa y reemplácela con la línea completa, por ejemplo, elimínela name_of_the_value=xxxy reemplácela conname_of_the_value=user_value
  2. Reemplace solo la xxxpieza (valor)
  3. Comente con '#' cualquier línea coincidente existente y escriba la línea completa al final del archivo.

¿ Pero cómo puedo usarlo echoo si no sé el valor?sedawk

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_valueparte 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 -ibandera del sedcomando 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

información relacionada