Поточное редактирование с игнорированием переводов строк

Аватар пользователя DRVTiny

Например, мне нужно, чтобы в файле следующего содержания:

Мотоцикл #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 для закрывающих тэгов используется прямой слэш)

Аватар пользователя DRVTiny

Re: Поточное редактирование с игнорированием переводов строк

Ну и? То ли у нас вообще кроме сгинувшего куда-то Славы никто не занимался программированием на Shel достаточно глубоко, то ли проблема включения переводов строк в регулярные выражения здесь никого не задевает... Я вот ещё немного поглубже копнул и обнаружил, что, оказывается, с помощью pcregrep можно использовать шаблоны регулярных выражений, содержащие \n, так что по крайней мере хотя бы читать многострочные записи я уже могу, но поскольку мне нужно редактировать файлы, а не читать их, то в общем мою проблему pcregrep не решает...

Аватар пользователя slavaz

Re: Поточное редактирование с игнорированием переводов строк

Цитата:
DRVTiny пишет:
Например, мне нужно, чтобы в файле следующего содержания:

Мотоцикл #23 {
производитель: Bimota
max скорость: 320 км/ч
разгон до 100 км/ч: - 3.5 сек
двигатель: V-образный, 4-х цилиндровый
}
Мотоцикл #24 {
производитель: Laverda
....
...
и т.д., и т.п.
}

Смотри вложение. Перед использованием найди в скрипте EDITFILE="./file.txt" и замени на свой путь к файлу... или переделай, чтоб параметром принимать - это не проблема.
Использование - просто жмакни по скрипту - выдаст краткий хелп.
Если по приведенному тобой примеру, то примерно так пользовать:

./edit.sh "#23" "двигатель" "зю-образный, xрeнaдцати цилиндровый"

Цитата:
P.S. Интересно, а с каких это пор на нашем форуме в блоках code стал так активно обрезаться обратный слэш, \, чем он там мешает?? (ведь, насколько я помню, в HTML и в XML для закрывающих тэгов используется прямой слэш)

Ставь два обратных слэша подряд.

ВложениеРазмер
DRVTiny_edit.sh.gz 681 байт
Аватар пользователя slavaz

Re: Поточное редактирование с игнорированием переводов строк

Цитата:
То ли у нас вообще кроме сгинувшего куда-то Славы никто не занимался программированием на Shel достаточно глубоко, то ли проблема включения переводов строк в регулярные выражения здесь никого не задевает...

Меня никуды не сгинуло, не боись. Улыбка

Аватар пользователя DRVTiny

Re: Поточное редактирование с игнорированием переводов строк

Н-да, интересное решение, очень похоже на простенький конечный автомат (внутри блока - состояние 1, вне его - состояние 0). Получается вариант, альтернативный использованию регулярных выражений. В общем, с практической точки зрения для моей задачи - синхронизации /etc/dhcpd.conf в соответствии с таблицей клиентов LAN - он мне вполне подходит (спасибо, Слава, как всегда выручил! Улыбка ), но при этом опять же остаётся нерешённым вопрос, как находить и заменять многострочные соответствия регэкспам в Shell (да хотя бы даже и в Perl). Дело в том, что регэкспы позволяют не только находить нужную информацию, но ещё и скурпулёзно проверять синтаксическую корректность формы её (информации) представления.
Например, скрипт на awk, который на каждом этапе разбора видит не дальше одной текущей строки, не нашёл бы ничего криминального в таком представлении записи:
Мотоцикл #23 {
HAPPY END
или даже таком:
Мотоцикл #23 {
двигатель: Змеевик полосчатый
}
(здесь отсутствуют обязательные поля)

Можно, конечно, вводить всё новые и новые булевы переменные или писать полноценный конечный автомат (но тогда будет иметь принципиальное значение порядок следования полей в записи), но только зачем городить такой забористый огород, если одним регулярным выражением можно не только выделить из потока синтаксически корректную запись, но и произвести все необходимые замены, а заодно проверить синтаксис всего файла в целом?

RSS-материал