perl|sed поиск\замена строк с переносами

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

perl|sed поиск\замена строк с переносами

Непрочитанное сообщение paix » 2008-05-01 16:08:14

Уже день гдето торможу, поэтому на суд общественности ;)

Для теста подручными средствами - приймем что начало секции маркеруется как sshd_enable в конфиге. Нужно вывести последуюшую за ней строку (или N строк до совпадения с концом секции)

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

srv # perl -ne 'print if  m/sshd.*/s' /etc/rc.conf
sshd_enable="YES"
но последующую строку не выводит. (шаблон m/sshd.*/s я оставил для простоты, пробовал более сложные варианты.)
Что я делаю не так?

ЗЫ. исходная задача - найти нужную секцию (пару десятков строк) в большом конфиге, сделать с ней что-нибудь и записать обратно. (скрипты автоматизации нагиоса)
т.е. в идеале я хотел что-то в духе

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

perl -pi -e "s/\(# ${HOST} START.*\)# ${HOST} END/$1\n${MYADDONS}\n# ${HOST} END/s" myconf
но застрял на match нескольких строк начиная от заданной
поидее \(# ${HOST} START.*\) где ${HOST} START - начальная метка, под ".*" должны попадать все оставшиеся строки до совпадания с конечной меткой. "s///s" вторая s для совпадения "." с концом строки. И все это дело обозначаем как переменную $1
With best wishes, Sergej Kandyla

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: perl|sed поиск\замена строк с переносами

Непрочитанное сообщение Alex Keda » 2008-05-01 19:58:22

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

acer$ grep powerd /etc/rc.conf
# powerd
powerd_enable="YES"
#powerd_flags="-a adaptive -b minimum"
powerd_flags="-a adaptive"
acer$     

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

acer$ grep "# powerd" --after-context=4 /etc/rc.conf
# powerd
powerd_enable="YES"
#powerd_flags="-a adaptive -b minimum"
powerd_flags="-a adaptive"
# For KDE
acer$     
или я не понял задачу?
Убей их всех! Бог потом рассортирует...

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: perl|sed поиск\замена строк с переносами

Непрочитанное сообщение paix » 2008-05-01 21:50:49

lissyara писал(а):

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

acer$ grep powerd /etc/rc.conf
# powerd
powerd_enable="YES"
#powerd_flags="-a adaptive -b minimum"
powerd_flags="-a adaptive"
acer$     
или я не понял задачу?
нет, задача выгрести строки от начальной метки до конечной.

т.е.
представив условно, что начальная метка "# powerd", а конечная "-b minimum"
выгрести все последующие строки от начальной включительно до конечной.
Количество строк между начальной и конечной меткой может быть произвольным.

т.е. нужно регулярное выражение с указанием начальной метки, любых символов + переносы строки, и конечной метки.

ЗЫ. абстрактно можно представить задачу как: в одном большом апачевском конфиге с кучей виртуалхостов скриптом отредактировать\добавить\удалить записи в секцию заданного виртуалхоста.
With best wishes, Sergej Kandyla

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: perl|sed поиск\замена строк с переносами

Непрочитанное сообщение Alex Keda » 2008-05-01 21:58:54

обязательно одной командой?
Убей их всех! Бог потом рассортирует...

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: perl|sed поиск\замена строк с переносами

Непрочитанное сообщение paix » 2008-05-01 22:06:18

lissyara писал(а):обязательно одной командой?
да хоть как нибудь ;)
Важен результат.

вообще задача должна решаться одной строчкой...но решительное впечатление, что где-то я торможу.
With best wishes, Sergej Kandyla

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: perl|sed поиск\замена строк с переносами

Непрочитанное сообщение Alex Keda » 2008-05-01 22:33:43

просто сед я не очень знаю, перл тоже =))
а вообще - если в несколько - найти позицию конца и грепом выбрать...
строки в три-четыре на шелле решиться....

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

acer$ cat /tmp/test.sh
#!/bin/sh

# find 1 pos
first=`grep "# battmond" --after-context=10000 /etc/rc.conf | wc -l`
# find 2 pos
second="`grep '# blue devices' --after-context=10000 /etc/rc.conf | wc -l`"
# calc diff
difference=`expr $first - $second`
difference2=`expr $difference - 1`

#grep
grep "# battmond" --after-context=$difference2 /etc/rc.conf


acer$ sh /tmp/test.sh
# battmond
battmond_enable="YES"
battmond_flags="-i 1"
acer$   
типа того...
Убей их всех! Бог потом рассортирует...

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: perl|sed поиск\замена строк с переносами

Непрочитанное сообщение paix » 2008-05-01 23:27:55

интересный вариант, спасибо.
Тоже нашел еще один вариант...проще

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

 # perl -ne 'print if /^firewall.*$/ .. /^pf_rules.*$/' /etc/rc.conf
firewall_enable="YES"
firewall_script="/etc/rc.fw"
pf_enable="YES"
pf_rules="/etc/pf.fw"
однако, все равно слишком избыточно.
никак в толк не возьму почему регуряное выражение не срабатывает.
With best wishes, Sergej Kandyla