【发布时间】:2021-02-24 18:22:25
【问题描述】:
我有一个 file.xml 如此组成:
...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 命令的正则表达式:
<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>
我检查了regex101 这个正则表达式的正确性,实际上它似乎正确地捕获了我正在寻找的 3 个字段。但是问题来了,因为我不知道如何打印这些字段。
cat file.xml | grep "<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>" -oP
这个命令打印整行,所以没什么用。
这个网站上已经写了几篇关于这个主题的帖子,所以我也尝试使用 bash 原生 正则表达式支持,结果很差:
regex="<Version>(\d+\.\d+)\.(\d+)([\w-]+)?<\/Version>"
txt=$(cat file.xml)
[[ "$txt" =~ $regex ]] --> it fails!
echo "${BASH_REMATCH[*]}"
很抱歉,我不知道如何解决这个问题。期望的输出应该是:
1.0
13
-alpha
【问题讨论】:
-
@Shawn 是的,你是对的。我忘了提到我不能使用纯 bash 以外的任何工具
-
用户再次请求正则表达式帮助,
regex标签被删除。我正在再次恢复它,但这对 SO 不利。 -
@LéaGris 一般来说,你是对的。但是,在我看来,解析整个 xml 文件中的单个标签并不是 bash 无法完成的任务
标签: regex linux bash grep pattern-matching