Необязательные параметры в регулярном выражении Bash

Я хочу проанализировать строки, подобные приведенным ниже, в разделить переменные с помощью регулярных выражений из Bash:

Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Entity";attributes="occi.core.id occi.core.title";

или

Category: resource;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Resource";rel="http://schemas.ogf.org/occi/core#entity";attributes="occi.core.summary";

Первая часть перед «title» является общей для всех строк, части title и атрибуты являются необязательными.

Мне удалось извлечь обязательные параметры, общие для всех строк, но у меня проблемы с необязательными параметрами, которые не обязательно присутствуют для всех строк.Насколько я узнал, Bash не поддерживает скобки без захвата, которые я бы использовал для этой цели.

Вот что я достиг на данный момент:

CATEGORY_REGEX='Category:\s*([^;]*);scheme="([^"]*)";class="([^"]*)";'
category_string='Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Entity";attributes="occi.core.id occi.core.title";'
[[ $category_string =~ $CATEGORY_REGEX ]]
echo ${BASH_REMATCH[0]}
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
echo ${BASH_REMATCH[3]}

Регулярным выражением, которое я хотел бы использовать (и которое работает для меня в Ruby), было бы:

CATEGORY_REGEX='Category:\s*([^;]*);\s*scheme="([^"]*)";\s*class="([^"]*)";\s*(?:title="([^"]*)";)?\s*(?:rel="([^"]*)";)?\s*(?:location="([^"]*)";)?\s*(?:attributes="([^"]*)";)?\s*(?:actions="([^"]*)";)?'

Есть ли другое решение для синтаксического анализа строки с помощью инструментов командной строки, не имея вернуться к Perl, Python или Ruby?

6
задан Florian Feldhaus 3 January 2012 в 21:40
поделиться