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