我有一个在 Ubuntu (Linux) 上使用的脚本,我想将它转换为在 Ubuntu (Linux) 和 MacOS X 上使用。grep
在 Linux 上不同于 grep
在 FreeBSD(即 MacOS X)上; MacOS X 上的 grep
不支持 -P
选项。不幸的是,在两个平台上使用 -E
选项不会给出相同的结果。考虑以下适用于 Linux 的代码:
wip_scenarios=$(grep -oP "^\d+ scenarios?" log/report.log | grep -oP "\d+")
echo "\n"
echo $wip_scenarios
这在 Linux 上返回一个 0
。将所有 -P
替换为 -E
可以在 MacOS X 上运行,但在 Linux 上,这只会返回一个 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]}
}
关于linux - 如何从使用 `grep -P` 转换为 `grep -E` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30585212/