regex – Bash正则表达式中的可选参数
发布时间:2020-12-15 21:53:34 所属栏目:安全 来源:网络整理
导读:我想使用 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:/
我想使用
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”之前的第一部分对所有字符串都是通用的,部分标题和属性是可选的. 我设法提取了所有字符串共有的强制参数,但是我对所有字符串不一定存在的可选参数有困难.据我所知,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? 解决方法
我不认为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]}" 请注意,从可选参数开始,我们每次都需要跳过一个组,因为4 on的偶数编号组包含参数名称和值(如果参数存在). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |