Страница 1 из 1
sed и вставка в середину файла через командную строку
Добавлено: 2012-01-30 13:57:13
brr
День добрый!
Необходимо периодически дописывать в файл несколько строчек, генерируемых программой, причем вставлять надо не в конец, а в определенное место. Скажем есть файл hosts.html и в нем есть строка 'blabla', и надо вставить после нее строку <p>BLABLA</p>. Причем то, что надо вставить передается в качестве параметра скрипту. Вот текст скрипта:
Вот так я его вызываю:
root@ubuntu104:/var/www# ./script.sh "<p>BLABLA</p>"
И вот что в итоге:
sed: -e выражение #1, символ 9: неизвестная команда: `$'
Пробовал менять кавычки, всякие скобочки, но чего-то безрезультатно... не подскажите как реализовать?
Re: sed и вставка в середину файла через командную строку
Добавлено: 2012-01-30 17:24:56
kpp
Гм.. И как Вы таким скриптом хотите что-то вставить?
Код: Выделить всё
sed '/blabla/a\
'$1 ./hosts.html > ./hosts.html_tmp
Примерно так, не проверял.
Если все так как надо
Re: sed и вставка в середину файла через командную строку
Добавлено: 2012-01-31 15:27:04
brr
Большое спасибо, все заработало, мой вариант тоже работал, если без передачи параметров... но в итоге остановился на вашем, однако возник косяк с обработкой пробелов в передаваемой строке, точнее с тем как их экранировать, вот мой вариант решения, путем замены сначала всех пробелов на нижнее подчеркивание, далее обработка и потом все обратно... но как-то на костыли смахивает....
Код: Выделить всё
#!/bin/sh
a=$(echo $(date) |sed 's/ /_/g')
c=$(echo $1 |sed 's/ /_/g')
b="<tr><td_BGCOLOR=aqua>$a</td><td_BGCOLOR=white><p><b>"$c"<b></p></td></tr>"
sed '14a\'$b /var/www/hosts.html > /var/www/hosts.tmp
cat /var/www/hosts.tmp |sed 's/_/ /g' >/var/www/hosts.html
Re: sed и вставка в середину файла через командную строку
Добавлено: 2012-01-31 15:36:27
kpp
Код: Выделить всё
b="123123 234 234 g"
sed '/blabla/a\
'"${b}" hosts.html > hosts.html_tmp
Все работает с пробелами.
Re: sed и вставка в середину файла через командную строку
Добавлено: 2012-01-31 17:26:12
brr
Да, действительно ваш вариант с "${b}" помог... осталось только как-нибудь сделать, чтобы работать без временного файла, т.к. иногда почему-то файлик hosts.html становится пустым... пока не нашел точно из-за чего...
Re: sed и вставка в середину файла через командную строку
Добавлено: 2012-01-31 17:49:15
kpp
Дело не во временном файле.
Скорее всего при определенных обстоятельствах(вставляемая строка какая-то эдакая) возникает ошибка в sed.
Re: sed и вставка в середину файла через командную строку
Добавлено: 2012-02-28 16:46:46
brr
Понаблюдал несколько недель, пришел к конечному варианту скрипта, не идеальный конечно вариант, но по крайней мере работает без сбоев.
Проблема была в том, что когда скрипт запускался одновременно несколько раз (бывало до 10), то временный файл переписывался в ноль, а потом он копировался на место основного, в результате терялись строки, куда вставлять новую информацию и все "умирало". В качестве выхода использовался стандартный вариант с pid файлом, который предварительно надо сделать. Вот сам скрипт:
Код: Выделить всё
#!/bin/sh
if [ -f /var/www/zab.pid ];
then
# "pid exist"
else
# "no pid file"
echo "123" > /var/www/zab.pid
b="<tr><td BGCOLOR=aqua>$(date)</td><td BGCOLOR=white><p><b>"$1"<b></p></td></tr>"
sed '14a\'"${b}" /var/www/hosts.html > /var/www/hosts.tmp
mv /var/www/hosts.tmp /var/www/hosts.html
rm /var/www/zab.pid
fi
sed и вставка в середину файла через командную строку
Добавлено: 2016-05-03 7:25:11
scorp309
Требуется помощь знающих людей - предложенный скрипт не взлетел

А очень надо!!! Задача та же - вставить определённую строку после строки с определённым ключевым словом. Система - pfsense. Поставить gsed не получилось (с ним всё проще было бы)
Создал файл test.txt с содержимым
написал скрипт по аналогии
Код: Выделить всё
#cat script.sh
#!/bin/sh
b="qqq"
sed -i '.bak' 'ba\'"${b}" /root/test.txt
Ругается sed: 1: "ba\qqq": undefined label 'a\qqq'
Задача стоит управлять правилами фаервола на pfsense удалённо с другой машины по ssh в обход web. Управление простейшее - включать/выключать по запросу 2 правила.
На удалённой машине Linux и gnu sed - уже появляются мысли тянуть файл с правилами на линуксовую машину, править его там и вертать в зад. Но это бред imho.
sed и вставка в середину файла через командную строку
Добавлено: 2016-05-03 23:01:02
scorp309
Нашёл решение!
Код: Выделить всё
#cat script.sh
#!/bin/sh
b='qqq\
'
sed '/b/a\
\'"${b}" test.txt