Как я могу получить и изменить значение строки внутри файла, если значение этой строки мне неизвестно?

Как я могу получить и изменить значение строки внутри файла, если значение этой строки мне неизвестно?

Я пытаюсь сделать следующее: есть файл, внутри него есть строка (она наверняка там будет, 100%) в этой модели:

name_of_the_value=xxx

Где ценность?числовойи неизвестныймной, потому что оно меняется между устройствами... Мне нужно каким-то образом получить значение xxxи заменить его другим значением, заданным пользователем через TextField(я использую Java для этого, это для приложения Android, но в любом случае это чистый скрипт оболочки).

Действует:

  1. Найдите и удалите всю строку и замените ее полной строкой, например, удалите name_of_the_value=xxxи замените ее наname_of_the_value=user_value
  2. Заменить только xxxчасть (значение)
  3. Закомментируйте символом «#» все существующие совпадающие строки и запишите полную строку в конце файла.

Но как я могу использовать его echo, sedесли awkя не знаю значения?

решение1

Предполагая, что часть user_value всегда состоит из 3 символов, вы можете сделать это следующим образом:

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

Или, если вы уверены, что за этой строкой ничего нет, вы также можете использовать:

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

Надеюсь, я правильно понял REGEX, я не профи в этом. Поэтому значение должно быть всегда длиной в 3 символа, лучше всего в шестнадцатеричном формате, потому что десятичная дробь не всегда имеет длину в 3 символа в случаях, когда число меньше 100. Второй случай должен работать, даже если число меньше 100, но он предполагает, что вся name_of_the_value=user_valueчасть находится в своей собственной строке. Теперь, проверяя это в терминале, вывод выглядит так для второго случая:

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

Конечно, вам нужно перенаправить вывод обратно в файл или использовать временный файл для обмена. Вы можете использовать:

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

Sed изменяет вывод только при чтении файла, а не при его записи. Sponge сохраняет вывод до тех пор, пока вы не закончите работу с ним, а затем записывает изменения обратно.

Если вы не хотите или не можете использовать Sponge, напишите второй файл, а затем поменяйте их местами, как в этой цепочке команд.

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

Как указал @kos в комментарии, вы также можете использовать -iфлаг команды sedдля обратной записи во входной файл без использования временного файла или sponge:

sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file

Связанный контент