Ave*_*ery 4 linux macos ubuntu grep bsd
我有一个在 Ubuntu (Linux) 上使用的脚本,我想将其转换为在 Ubuntu (Linux) 和 MacOS X 上使用。Linux 上的脚本与FreeBSD(即 MacOS X)上grep的不同;MacOS X 上不支持该选项。不幸的是,在两个平台上使用该选项不会产生相同的结果。考虑以下在 Linux 上运行的代码:grepgrep-P-E
wip_scenarios=$(grep -oP "^\d+ scenarios?" log/report.log | grep -oP "\d+")
echo "\n"
echo $wip_scenarios
这会0在 Linux 上返回 a。将所有内容替换-P为-E使得它可以在 MacOS X 上工作,但在 Linux 上,这只会返回 a 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]}
}