Доброго дня всем. Мне понадобилось решение подобной задачи, после некоторого поиска я не нашел решения которое бы устраивало меня полностью. В частности наиболее подходящее решение приведено здесь, но его недостаток двойной проход чтения файла, а нужно изменить или добавить разумеется за один проход. В частности потому что в этом же проходе выполняются другие операции с текстом. Я решил что надо получше разобраться с sed, но он оказался очень капризным, в части выполнения команд, когда они передаются прям в командной строке а не в файле, причем ошибок не пишется просто работает не как ожидается.
Я воспользовался случаем задать вопрос Евгению Степанищеву. ( как Вы знаете автор игры Шахматы написанные на sed ) По его слова эта тривиальная задача решается так:
s/^\(hello=\).*/\11000/g
t
$ a\
hello=1000
и запуск:
sed -f replace.sed входной_файл
Спасибо Евгению за решение.
Надо сказать что я был абсолютно близок к решению, но не получил его, из-за капризностей правильнее сказать или тонкостей работы с командами sed передаваемые в командной строке, так как я не пытался создать файл и писать в нем нечто подобное, а делалал все в командной строке. Предложенное решение хотя и работало, но мне нужно именно в командной строке (без файла программы). Привести к требуемому виду, удалось не сразу, собственно первое время было примерно тоже самое что и сначала, то метки не замечались sed'ом переходы не выполнялись и прочее, что все обусловлено рядом тонкостей, в частности необходимо разбивать на несколько команд наборов (ключ -e) по меньшей мере из-за меток, новая строка в команде 'a', экранирование символов, предварительная обработка значений , содержащих '/', так: sed 's#/#\\\\/#g' и похоже это еще не всё.
Полный вариант решения, на основе приведенного выше и с учетом того что было мне необходимо, в частности один проход и размещение в sh файле у меня получилось такое:
sed -e "s/^$varname=.*/$varname=\"$value\"/g" \
-e '/^'$varname'.*/,$b' -e "\$ a \\
$varname=\"$value\""
Соответственно если упростить до исходной задачи, то примерно так:
sed -e "s/^hello=.*/hello=1000/g" \
-e '/^hello.*/,$b' -e "\$ a \\
hello=1000"