The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"sed замена строки в файле(по подстроке)"
Отправлено oklas, 26-Окт-13 23:57 
Доброго дня всем.

  Мне понадобилось решение подобной задачи, после некоторого поиска я не нашел решения которое бы устраивало меня полностью. В частности наиболее подходящее решение приведено здесь, но его недостаток двойной проход чтения файла, а нужно изменить или добавить разумеется за один проход. В частности потому что в этом же проходе выполняются другие операции с текстом. Я решил что надо получше разобраться с 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"

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру