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

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

Добавлено: 2008-05-01 16:08:14
paix
Уже день гдето торможу, поэтому на суд общественности ;)

Для теста подручными средствами - приймем что начало секции маркеруется как 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

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

Добавлено: 2008-05-01 19:58:22
Alex Keda

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

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$     
или я не понял задачу?

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

Добавлено: 2008-05-01 21:50:49
paix
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"
выгрести все последующие строки от начальной включительно до конечной.
Количество строк между начальной и конечной меткой может быть произвольным.

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

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

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

Добавлено: 2008-05-01 21:58:54
Alex Keda
обязательно одной командой?

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

Добавлено: 2008-05-01 22:06:18
paix
lissyara писал(а):обязательно одной командой?
да хоть как нибудь ;)
Важен результат.

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

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

Добавлено: 2008-05-01 22:33:43
Alex Keda
просто сед я не очень знаю, перл тоже =))
а вообще - если в несколько - найти позицию конца и грепом выбрать...
строки в три-четыре на шелле решиться....

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

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$   
типа того...

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

Добавлено: 2008-05-01 23:27:55
paix
интересный вариант, спасибо.
Тоже нашел еще один вариант...проще

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

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