Я хочу разобрать строки, похожие на следующие, в отдельные переменные, используя регулярные выражения из 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";
Первая часть перед «заголовком» является общей для всех строк, заголовок и атрибуты частей являются необязательными.
Мне удалось извлечь обязательные параметры, общие для всех строк, но у меня возникли проблемы с необязательными параметрами, которые необязательно присутствуют для всех строк. Насколько я узнал, 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?