使用 bash 正则表达式,我们可以捕获重复捕获组的最后一个捕获组吗?

问题描述 投票:0回答:1

引发这个问题的具体问题是,我正在编写一个 bash 脚本来使用

df -k
检查磁盘利用率,并希望脚本在利用率超过阈值(例如 90%)时执行某些操作。

所以我得到这样的一行:

/dev/xvda1       8376300 7611164    765136  91% /

如何获得91%的部分?在我看来,我们可以将行分解为非空白块,然后是空白块,并且这种模式重复,最后一次出现包含 91%,即“91%”。事实上,当我使用 regex101.com 并输入

([^\s]+[\s]+)+

它给出了一个有希望的结果:

尤其是很高兴看到

重复捕获组将仅捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组

正如 regex101.com 所说,我指定了一个重复的捕获组,只有最后一个“91%”会作为

Group 1
返回。完美。

但是,当我在 bash 中使用这个正则表达式来提取所需的部分时,它以某种方式将整行作为输出。

$ df -k | grep xvda1 | sed "s/\([^\s]+[\s]+\)+/\1/"
/dev/xvda1       8376300 7610788    765512  91% /

知道出了什么问题吗? bash 的正则表达式实现(ERE suppositly)是否不遵循捕获重复捕获组的最后一个捕获组的行为?在 regex101.com 中,没有 ERE 选项,因此我尝试使用 PCRE 和 PCRE2,两者都给出了相同的结果。

regex bash regex-group
1个回答
0
投票

这里不需要正则表达式,它会增加不必要的复杂性。因此,除非您真的想通过正则表达式来执行此操作,否则只需选择“使用”列并使用它即可。然后清理 % 就可以了。

zca@elitedesk:~$ df -k | awk '{print $5}'
Use%
1%
24%
0%
0%
28%
2%
3%
1%
© www.soinside.com 2019 - 2024. All rights reserved.