Bash正则表达式中的可选参数

Flo*_*aus 6 regex string bash text-parsing

我想使用Bash中的正则表达式将类似于以下内容的字符串解析为单独的变量:

Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Entity";attributes="occi.core.id occi.core.title";
Run Code Online (Sandbox Code Playgroud)

要么

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";
Run Code Online (Sandbox Code Playgroud)

"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]}
Run Code Online (Sandbox Code Playgroud)

我想使用的正则表达式(以及适用于Ruby的正则表达式)将是:

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

有没有其他解决方案来解析字符串与命令行工具,而不必回退perl,python或ruby?

And*_*ark 8

我不认为bash正则表达式中存在非捕获组,因此您可以选择使用脚本语言或?:从所有(?:...)组中删除它们,并且要注意您引用的组,例如:

CATEGORY_REGEX='Category:\s*([^;]*);\s*scheme="([^"]*)";\s*class="([^"]*)";\s*(title="([^"]*)";)?\s*(rel="([^"]*)";)?\s*(location="([^"]*)";)?\s*(attributes="([^"]*)";)?\s*(actions="([^"]*)";)?'
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 "full:       ${BASH_REMATCH[0]}"
echo "category:   ${BASH_REMATCH[1]}"
echo "scheme:     ${BASH_REMATCH[2]}"
echo "class:      ${BASH_REMATCH[3]}"
echo "title:      ${BASH_REMATCH[5]}"
echo "rel:        ${BASH_REMATCH[7]}"
echo "location:   ${BASH_REMATCH[9]}"
echo "attributes: ${BASH_REMATCH[11]}"
echo "actions:    ${BASH_REMATCH[13]}"
Run Code Online (Sandbox Code Playgroud)

请注意,从可选参数开始,我们每次都需要跳过一个组,因为4 on的偶数编号组包含参数名称和值(如果参数存在).