Имена файлов и т. д. разбросаны по диску в инодах, так что они (большинство из них, некоторые могли быть в обнуленной части )все еще должны быть.
Другое дело, как их найти. Когда корневой индекс потерян, я не думаю, что есть какой-либо способ узнать, какие блоки содержат индексы, это означает, что вы остаетесь с программами, которые читают необработанные блоки данных и угадывают, какие из них что, а индексы, вероятно, трудно найти. определить, я понятия не имею, может ли это сделать какая-либо программа (Я не слышал об этом ).
Так как ваш формат ввода не соответствует -стандарту, вам нужно написать парсер для его обработки. Существует два подхода :вы можете написать его "вручную" на любом процедурном языке программирования (, как правило, в качестве верхнего -рекурсивного спускового синтаксического анализатора ), или вы можете использовать какой-либо генератор синтаксических анализаторов. В последнем подходе вы определяете BNF грамматики вашего ввода, и инструмент строит синтаксический анализатор для вас. Если вы можете использовать Scala, это очень упрощает задачу.
Другим генератором синтаксических анализаторов, часто используемым в мире XML, является REx -. Он удобен тем, что генерирует синтаксический анализатор в XQuery или XSLT, что значительно упрощает задачу генерации XML; это отличная программа, но, к сожалению, она очень плохо документирована. Другим инструментом, ориентированным на XML -, является «Invisible XML» Стивена Пембертона (https://homepages.cwi.nl/~steven/ixml/)--. Если REx — отличное программное обеспечение с плохой документацией, то Invisible XML, к сожалению, — отличная документация с небольшим количеством опубликованного программного обеспечения.
Еще один дешевый -и -веселый подход приходит мне на ум :с довольно простым сценарием редактора, основанным на регулярных выражениях, вы можете:
и тогда у вас будет что-то, что многие парсеры JSON примут (это не совсем соответствует, потому что ваши точки с запятой являются терминаторами, а не разделителями, но многие парсеры JSON допускают это.)
Ниже приведена простая awk
программа, которая предполагает, что данные выглядят точно так же, как вы показываете, т. е. что
{
, ;
, и что }
встречается в строках, на которых больше ничего нет. Он использует стек для отслеживания того, с каким тегом он работает в данный момент, и помещает в стек новые теги, когда они встречаются во входных данных. Когда найден }
, выводится конечный тег для вершины стека. Строки данных обнаруживаются по тому факту, что они не заканчиваются ни одиночным символом {
, ни символом }
.
Никаких попыток проверки данных не предпринимается.
$NF == "{" {
stack[++top] = $1 # push tag to stack
printf "<%s>\n", stack[top] # output opening tag
next
}
$NF == "}" {
printf "</%s>\n", stack[top--] # output closing tag + pop stack
next
}
{
sub(";$", "", $2) # remove ; from EOL
printf "<%s>%s</%s>\n", $1, $2, $1 # output tag with data
}
Для вашего примера данных awk -f script.awk data.in
дает
<unknown-applications>
<unknown-tcp>
<destinations-per-hour>10</destinations-per-hour>
<sessions-per-hour>10</sessions-per-hour>
<session-length>
<maximum-bytes>100</maximum-bytes>
<minimum-bytes>50</minimum-bytes>
</session-length>
</unknown-tcp>
<unknown-udp>
<destinations-per-hour>10</destinations-per-hour>
<sessions-per-hour>10</sessions-per-hour>
<session-length>
<maximum-bytes>100</maximum-bytes>
<minimum-bytes>50</minimum-bytes>
</session-length>
</unknown-udp>
</unknown-applications>
, который при прогоне через xmlstarlet fo
превращается в
<?xml version="1.0"?>
<unknown-applications>
<unknown-tcp>
<destinations-per-hour>10</destinations-per-hour>
<sessions-per-hour>10</sessions-per-hour>
<session-length>
<maximum-bytes>100</maximum-bytes>
<minimum-bytes>50</minimum-bytes>
</session-length>
</unknown-tcp>
<unknown-udp>
<destinations-per-hour>10</destinations-per-hour>
<sessions-per-hour>10</sessions-per-hour>
<session-length>
<maximum-bytes>100</maximum-bytes>
<minimum-bytes>50</minimum-bytes>
</session-length>
</unknown-udp>
</unknown-applications>