5W site logo 5W - мой домашний сайт-блог с картинками, кино и плюшками.

zamena-stroki.txt

Необходимо с помощью sed и/или awk заменить все строки в файле содержащие подстроку, например есть файл:
hello=123
asdfsdfsdfsdf
sdfsdf
klk lksd isdfritj nm
hello=56
sdf
sdfklksdflksd
hello=678
sdnfhfgh dfrtllk
Нужно заменить все строки имеющие подстроку "hello=чтото там" на строку hello=1000

cat $file | sed 's/^hello=.*/hello=1000/g' > $newfile

если не найдено то "hello=1000" вставить в конец файла ?
с=`cat file|grep -c 'hello=1000'`
[ $c -eq 0 ] && echo 'hello=1000' >> $file

Полный вариант решения, на основе приведенного выше и с учетом того что было мне необходимо, в частности один проход и размещение в 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"

Сообщение от SnowPraha on 21-Окт-16, 23:23
В одну строку без заморочек, привет Евгению Степанищеву
sed -i 's/^Hello=.*/Hello=1000/g' filename
-------------------------------------------------
пути экранируются через \, напрмер
sed 's/\/usr\/bin/\/usr\/local\/bin/'
Можно убрать «частокол» используя другой разделитель:
sed позволяет нам самостоятельно задавать символы-разделители для использования их в команде замены. Разделителем считается первый символ, который будет встречен после s:

$ sed 's!/bin/bash!/bin/csh!' /etc/passwd

echo "/usr/local/bin" | sed 's~/usr/local/bin~/common/bin~'
---------------------------------------------------
Замена строк

Команда c позволяет изменить содержимое целой строки текста в потоке данных. При её вызове нужно указать номер строки, вместо которой в поток надо добавить новые данные:

$ sed '3c\This is a modified line.' myfile

Замена строки целиком

Если воспользоваться при вызове команды шаблоном в виде обычного текста или регулярного выражения, заменены будут все соответствующие шаблону строки:

$ sed '/This is/c This is a changed line of text.' myfile
--------------------------------------------------
Вывод номеров строк

Если вызвать sed, использовав команду =, утилита выведет номера строк в потоке данных:

$ sed '=' myfile

Потоковый редактор вывел номера строк перед их содержимым.
Если передать этой команде шаблон и воспользоваться ключом sed -n, выведены будут только номера строк, соответствующих шаблону:

$ sed -n '/test/=' myfile
--------------------------------------------------------
Чтение данных для вставки из файла

Выше мы рассматривали приёмы вставки данных в поток, указывая то, что надо вставить, прямо при вызове sed. В качестве источника данных можно воспользоваться и файлом. Для этого служит команда r, которая позволяет вставлять в поток данные из указанного файла. При её вызове можно указать номер строки, после которой надо вставить содержимое файла, или шаблон.

Рассмотрим пример:

$ sed '3r newfile' myfile

Вставка в поток содержимого файла

Тут содержимое файла newfile было вставлено после третьей строки файла myfile.
Вот что произойдёт, если применить при вызове команды r шаблон:

$ sed '/test/r newfile' myfile
Использование шаблона при вызове команды r
Содержимое файла будет вставлено после каждой строки, соответствующей шаблону.

Пример
Представим себе такую задачу. Есть файл, в котором имеется некая последовательность символов, сама по себе бессмысленная, которую надо заменить на данные, взятые из другого файла. А именно, пусть это будет файл newfile, в котором роль указателя места заполнения играет последовательность символов DATA. Данные, которые нужно подставить вместо DATA, хранятся в файле data.

Решить эту задачу можно, воспользовавшись командами r и d потокового редактора sed:

$ Sed '/DATA>/ {
r newfile
d}' myfile

Замена указателя места заполнения на реальные данные
Как видите, вместо заполнителя DATA sed добавил в выходной поток две строки из файла data.