sed и вставка в середину файла через командную строку

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
brr
проходил мимо
Сообщения: 4
Зарегистрирован: 2012-01-30 13:25:23

sed и вставка в середину файла через командную строку

Непрочитанное сообщение brr » 2012-01-30 13:57:13

День добрый!
Необходимо периодически дописывать в файл несколько строчек, генерируемых программой, причем вставлять надо не в конец, а в определенное место. Скажем есть файл hosts.html и в нем есть строка 'blabla', и надо вставить после нее строку <p>BLABLA</p>. Причем то, что надо вставить передается в качестве параметра скрипту. Вот текст скрипта:

Код: Выделить всё

#!/bin/sh
sed -i '/blabla/$1' ./hosts.html


Вот так я его вызываю:
root@ubuntu104:/var/www# ./script.sh "<p>BLABLA</p>"

И вот что в итоге:
sed: -e выражение #1, символ 9: неизвестная команда: `$'

Пробовал менять кавычки, всякие скобочки, но чего-то безрезультатно... не подскажите как реализовать?

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: sed и вставка в середину файла через командную строку

Непрочитанное сообщение kpp » 2012-01-30 17:24:56

Гм.. И как Вы таким скриптом хотите что-то вставить?

Код: Выделить всё

sed '/blabla/a\
'$1 ./hosts.html > ./hosts.html_tmp

Примерно так, не проверял.
Если все так как надо

Код: Выделить всё

mv ./hosts.html_tmp ./hosts.html
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

brr
проходил мимо
Сообщения: 4
Зарегистрирован: 2012-01-30 13:25:23

Re: sed и вставка в середину файла через командную строку

Непрочитанное сообщение brr » 2012-01-31 15:27:04

Большое спасибо, все заработало, мой вариант тоже работал, если без передачи параметров... но в итоге остановился на вашем, однако возник косяк с обработкой пробелов в передаваемой строке, точнее с тем как их экранировать, вот мой вариант решения, путем замены сначала всех пробелов на нижнее подчеркивание, далее обработка и потом все обратно... но как-то на костыли смахивает....

Код: Выделить всё

#!/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

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: sed и вставка в середину файла через командную строку

Непрочитанное сообщение kpp » 2012-01-31 15:36:27

Код: Выделить всё

b="123123 234 234 g"
sed '/blabla/a\
'"${b}" hosts.html > hosts.html_tmp

Все работает с пробелами.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

brr
проходил мимо
Сообщения: 4
Зарегистрирован: 2012-01-30 13:25:23

Re: sed и вставка в середину файла через командную строку

Непрочитанное сообщение brr » 2012-01-31 17:26:12

Да, действительно ваш вариант с "${b}" помог... осталось только как-нибудь сделать, чтобы работать без временного файла, т.к. иногда почему-то файлик hosts.html становится пустым... пока не нашел точно из-за чего...

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: sed и вставка в середину файла через командную строку

Непрочитанное сообщение kpp » 2012-01-31 17:49:15

Дело не во временном файле.
Скорее всего при определенных обстоятельствах(вставляемая строка какая-то эдакая) возникает ошибка в sed.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

brr
проходил мимо
Сообщения: 4
Зарегистрирован: 2012-01-30 13:25:23

Re: sed и вставка в середину файла через командную строку

Непрочитанное сообщение brr » 2012-02-28 16:46:46

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

scorp309
проходил мимо

sed и вставка в середину файла через командную строку

Непрочитанное сообщение scorp309 » 2016-05-03 7:25:11

Требуется помощь знающих людей - предложенный скрипт не взлетел :( А очень надо!!! Задача та же - вставить определённую строку после строки с определённым ключевым словом. Система - pfsense. Поставить gsed не получилось (с ним всё проще было бы)
Создал файл test.txt с содержимым

Код: Выделить всё

#cat test.txt
a
b
c
d

написал скрипт по аналогии

Код: Выделить всё

#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.



Вернуться в «SHELL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя