【发布时间】:2012-02-01 21:09:08
【问题描述】:
我想使用 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?
【问题讨论】:
标签: regex string bash text-parsing