如何从使用 `grep -P` 转换为 `grep -E`?

How do I convert from using `grep -P` to `grep -E`?

我有一个在 Ubuntu (Linux) 上使用的脚本,我想将其转换为在 Ubuntu (Linux) 上使用和 MacOS X。Linux 上的 grep 不同于 FreeBSD(即 MacOS X)上的 grepgrep 在 MacOS X 上不支持 -P 选项。不幸的是,在两个平台上使用 -E 选项不会给出相同的结果。考虑以下适用于 Linux 的代码:

wip_scenarios=$(grep -oP "^\d+ scenarios?" log/report.log | grep -oP "\d+")
echo "\n"
echo $wip_scenarios

这个 returns 一个 0 在 Linux 上。将所有 -P 替换为 -E 可以在 MacOS X 上运行,但在 Linux 上,这只是 returns 一个 null,对其余部分没有帮助当我使用这样的条件时我的脚​​本:

if [ $wip_scenarios != 0 ];then

一个解决方案是在前面放一个标志并根据平台使用适当的选项集,但我希望有一个跨平台的解决方案。有办法吗?

对于您在此处提供的正则表达式,这很简单:将 \d 更改为 [[:digit:]]

因此:

wip_scenarios=$(grep -Eo '^[[:digit:]]+ scenarios[?]' <report.log | grep -Eo '[[:digit:]]+')

如果您的脚本以 #!/bin/bash 开头(因此只会是 运行 和 bash),我还会考虑跳过对非标准扩展的依赖 grep -o,而是根据 bash 本身来分离出您关心的数字:

# This works with any POSIX-compliant grep, but requires that the shell be bash
wip_scenarios_re='([[:digit:]]+) scenarios[?]'
wip_scenarios_line=$(grep -E '^[[:digit:]]+ scenarios[?]' <report.log)
[[ $wip_scenarios_line =~ $wip_scenarios_re ]] && {
  wip_scenarios=${BASH_REMATCH[1]}
}