Я хотел бы иметь несколько сценариев для экспорта данных конфигурации, похожих на Junos, для сортировки данных типа CSV (разделенных вкладками) и обратно. Пример (и AFAIK достаточный) ввод может быть следующим:
firewall {
filter protect {
term "protocol bgp" {
from {
prefix-list {
bgp-peers;
}
protocol tcp; ## Any ideas how to preserve comments in output?
port bgp;
}
then accept;
}
term protocol_ntp {
from {
prefix-list {
"protocol ntp";
}
protocol udp;
port ntp;
}
then accept;
}
}
}
Ожидаемый результат будет следующим (столбцы «|» обозначают места, где ожидаются вкладки):
firewall|filter protect|term "protocol bgp"|from|prefix-list|bgp-peers;
firewall|filter protect|term "protocol bgp"|from|protocol tcp;
firewall|filter protect|term "protocol bgp"|from|port bgp;
firewall|filter protect|term "protocol bgp"|then accept;
firewall|filter protect|term protocol_ntp|from|prefix-list|"protocol ntp";
firewall|filter protect|term protocol_ntp|from|protocol udp;
firewall|filter protect|term protocol_ntp|from|port ntp;
firewall|filter protect|term protocol_ntp|then accept;
На первый взгляд, проблема кажется довольно простой, но во-вторых, это не из-за двойных кавычек.
Проблема IMHO сводится к проблеме "дерево-таблица" и "таблица-дерево" с некоторой дополнительной обработкой двойных кавычек. Я, честно говоря, не знаю, чтобы сделать это правильно ...
Я бы предпочел решения в следующем порядке по популярности (для меня): в sed(1)
(может быть очень быстрым), в awk(1)
(не так приятно, как предыдущий для меня), в perl(1)
(почему нет, если используется только простой Perl с только strict
и warnings
модулями) или в ANSI C без дополнительных библиотек, просто база (я не думаю, что кто-то хотел бы написать парсеры для меня здесь на всех, но никто не знает).