Например, мне нужно, чтобы в файле следующего содержания:
Мотоцикл #23 { производитель: Bimota max скорость: 320 км/ч разгон до 100 км/ч: - 3.5 сек двигатель: V-образный, 4-х цилиндровый } Мотоцикл #24 { производитель: Laverda .... ... и т.д., и т.п. }
Можно было заменить те или иные поля для записи Мотоцикл #23 с помощью регулярных выражений в таком стиле:
Содержимое файла:
a
b
c
Замена:
s%a\nb\nc%d\ne\nf%
Мне нужно реализовать это какими угодно средствами, доступными из скриптов на BASH (в т.ч. можно и с помощью perl -e). В данном конкретном случае задачей является редактирование записей host в файле dhcpd.conf, но вообще мне эта проблема поточного редактирования, при котором перевод строки в файле будет считаться таким же сивмолом, как и все остальные, а ^ и $ будут совпадать с началом и концом файла соответств., уже давно не даёт покоя...
Подскажите, пожалуйста, какое-нибудь решение, буду очень признателен.
P.S. Интересно, а с каких это пор на нашем форуме в блоках code стал так активно обрезаться обратный слэш, \, чем он там мешает?? (ведь, насколько я помню, в HTML и в XML для закрывающих тэгов используется прямой слэш)
Re: Поточное редактирование с игнорированием переводов строк
Ну и? То ли у нас вообще кроме сгинувшего куда-то Славы никто не занимался программированием на Shel достаточно глубоко, то ли проблема включения переводов строк в регулярные выражения здесь никого не задевает... Я вот ещё немного поглубже копнул и обнаружил, что, оказывается, с помощью pcregrep можно использовать шаблоны регулярных выражений, содержащие \n, так что по крайней мере хотя бы читать многострочные записи я уже могу, но поскольку мне нужно редактировать файлы, а не читать их, то в общем мою проблему pcregrep не решает...
Re: Поточное редактирование с игнорированием переводов строк
Смотри вложение. Перед использованием найди в скрипте
EDITFILE="./file.txt"
и замени на свой путь к файлу... или переделай, чтоб параметром принимать - это не проблема.Использование - просто жмакни по скрипту - выдаст краткий хелп.
Если по приведенному тобой примеру, то примерно так пользовать:
Ставь два обратных слэша подряд.
Re: Поточное редактирование с игнорированием переводов строк
Меня никуды не сгинуло, не боись.
Re: Поточное редактирование с игнорированием переводов строк
Н-да, интересное решение, очень похоже на простенький конечный автомат (внутри блока - состояние 1, вне его - состояние 0). Получается вариант, альтернативный использованию регулярных выражений. В общем, с практической точки зрения для моей задачи - синхронизации /etc/dhcpd.conf в соответствии с таблицей клиентов LAN - он мне вполне подходит (спасибо, Слава, как всегда выручил!
), но при этом опять же остаётся нерешённым вопрос, как находить и заменять многострочные соответствия регэкспам в Shell (да хотя бы даже и в Perl). Дело в том, что регэкспы позволяют не только находить нужную информацию, но ещё и скурпулёзно проверять синтаксическую корректность формы её (информации) представления.
Например, скрипт на awk, который на каждом этапе разбора видит не дальше одной текущей строки, не нашёл бы ничего криминального в таком представлении записи:
Мотоцикл #23 {
HAPPY END
или даже таком:
Мотоцикл #23 {
двигатель: Змеевик полосчатый
}
(здесь отсутствуют обязательные поля)
Можно, конечно, вводить всё новые и новые булевы переменные или писать полноценный конечный автомат (но тогда будет иметь принципиальное значение порядок следования полей в записи), но только зачем городить такой забористый огород, если одним регулярным выражением можно не только выделить из потока синтаксически корректную запись, но и произвести все необходимые замены, а заодно проверить синтаксис всего файла в целом?