Страница 1 из 1

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

Добавлено: 2012-01-30 13:57:13
brr
День добрый!
Необходимо периодически дописывать в файл несколько строчек, генерируемых программой, причем вставлять надо не в конец, а в определенное место. Скажем есть файл 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: неизвестная команда: `$'

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

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

Добавлено: 2012-01-30 17:24:56
kpp
Гм.. И как Вы таким скриптом хотите что-то вставить?

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

sed '/blabla/a\
'$1 ./hosts.html > ./hosts.html_tmp
Примерно так, не проверял.
Если все так как надо

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

mv ./hosts.html_tmp ./hosts.html

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

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

Добавлено: 2016-05-03 23:01:02
scorp309
Нашёл решение!

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

#cat script.sh

#!/bin/sh
b='qqq\
'
sed '/b/a\
\'"${b}" test.txt