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?
我不认为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的偶数编号组包含参数名称和值(如果参数存在).
| 归档时间: |
|
| 查看次数: |
5038 次 |
| 最近记录: |