Ваши данные выглядят так, как если бы их было легко перевести в XML. Оттуда вы можете легко использовать стандартные инструменты XML, такие как XSLT, чтобы точно указать, что вы хотите извлечь.
Для этого небольшого примера подход XML, вероятно, излишний, и если вам нужно справиться, скажем, с экранированными скобками, или с вещами, которые нужно экранировать, чтобы быть правильно сформированным XML, возможно, это не стоит усилий , Но если вы хотите крепкий и портативный, я бы сказал, что это путь.
Ваши данные выглядят как S-выражения; может быть, уже есть что-то вроде xsltproc
для S-выражений?
Вот краткий двухслойный Perl, который, кажется, работает для преобразования ваших тестовых данных в какой-то псевдо-XML. Я не пытался обрабатывать корневые узлы; Спросите еще раз, если вам нужна дополнительная помощь.
$ perl -pe 's{\(([^\s=]+)=|\)}{ if (defined $1) { push @tags, $1; "<$1>" }
> else { sprintf("</%s>", pop @tags) } }ge' /tmp/data
CLASS=
<SOURCE>
<TYPE>FILE</TYPE>
<DEFAULT>
<DIRNAME>${HOME}/information/logs</DIRNAME>
</DEFAULT>
</SOURCE>
OTHER=
<SOURCE>
<TYPE>FILE</TYPE>
<DEFAULT>
<DIRNAME>${HOME}/site/location</DIRNAME>
</DEFAULT>
</SOURCE>
STUDENT=
<SOURCE>
<TYPE>FILE</TYPE>
<DEFAULT>
<DIRNAME>/opt/students</DIRNAME>
</DEFAULT>
</SOURCE>