首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bash -打印regex捕获组

bash -打印regex捕获组
EN

Stack Overflow用户
提问于 2020-11-12 17:49:52
回答 2查看 130关注 0票数 1

我有一个file.xml,它是这样组成的:

代码语言:javascript
运行
复制
...some xml text here...
    <Version>1.0.13-alpha</Version>
...some xml text here...

我需要提取以下信息:

  • mayor_and_minor_release_number --> 1.0
  • patch_number --> 13
  • 后缀--> -alpha

我认为实现这一点的最干净的方法是使用grep命令进行正则表达式:

代码语言:javascript
运行
复制
<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>

我已经用regex101检查了这个正则表达式的正确性,实际上它似乎正确地捕获了我正在寻找的三个字段。但问题来了,因为我不知道如何打印这些字段。

代码语言:javascript
运行
复制
cat file.xml | grep "<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>" -oP

这个命令打印整个行,所以它是无用的。

在这个站点上已经写了几篇关于这个主题的文章,所以我也尝试使用bash本机regex支持,结果很糟糕:

代码语言:javascript
运行
复制
regex="<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>"
txt=$(cat file.xml)
[[ "$txt" =~ $regex ]]     --> it fails!
echo "${BASH_REMATCH[*]}"

对不起,我想不出该怎么解决这个问题。预期的产出应是:

代码语言:javascript
运行
复制
1.0
13
-alpha
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-12 18:00:32

您可以使用与您的read + sed解决方案类似的正则表达式:

代码语言:javascript
运行
复制
read -r major minor suffix < <(
sed -nE 's~.*<Version>([0-9]+\.[0-9]+)\.([0-9]+)(-[^<]*)</Version>.*~\1 \2 \3~p' file.xml
)

检查变量内容:

代码语言:javascript
运行
复制
declare -p major minor suffix

declare -- major="1.0"
declare -- minor="13"
declare -- suffix="-alpha"

以下几点:

  • 如果不在\d中使用-P (perl)模式,就不能使用grep
  • grep命令不返回捕获组
票数 1
EN

Stack Overflow用户

发布于 2020-11-12 19:09:22

使用这个Perl一行程序:

代码语言:javascript
运行
复制
perl -lne 'print for m{<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>};' file.xml

示例:

代码语言:javascript
运行
复制
echo '<Version>1.0.13-alpha</Version>' | perl -lne 'print for m{<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>};'

输出:

代码语言:javascript
运行
复制
1.0
13
-alpha

Perl一行程序使用以下命令行标志:

-e:告诉Perl在行中查找代码,而不是在文件中。

-n:每次循环输入一行,默认情况下将其分配给$_

-l:在执行代码行之前,先去掉输入行分隔符(默认情况下是*NIX上的"\n"),然后在打印时追加它。

还请参见:

*如何执行Perl解释器:命令行开关

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64809125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档