Я пытаюсь сделать следующее: есть файл, внутри него есть строка (она наверняка там будет, 100%) в этой модели:
name_of_the_value=xxx
Где ценность?числовойи неизвестныймной, потому что оно меняется между устройствами... Мне нужно каким-то образом получить значение xxx
и заменить его другим значением, заданным пользователем через TextField
(я использую Java для этого, это для приложения Android, но в любом случае это чистый скрипт оболочки).
Действует:
- Найдите и удалите всю строку и замените ее полной строкой, например, удалите
name_of_the_value=xxx
и замените ее наname_of_the_value=user_value
- Заменить только
xxx
часть (значение) - Закомментируйте символом «#» все существующие совпадающие строки и запишите полную строку в конце файла.
Но как я могу использовать его 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