【发布时间】:2015-08-15 14:29:49
【问题描述】:
我有一个在 Ubuntu (Linux) 上使用的脚本,我想将其转换为在 Ubuntu (Linux) 和 MacOS X 上使用。Linux 上的 grep 与 FreeBSD 上的 grep 不同(即 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。用-E 替换所有-P 可以在MacOS X 上工作,但在Linux 上,这只会返回一个null,当我使用这样的条件时,这对我的脚本的其余部分没有帮助:
if [ $wip_scenarios != 0 ];then
一种解决方案是在前面放置一个标志并根据平台使用适当的选项集,但我希望有一个跨平台的解决方案。有没有办法做到这一点?
【问题讨论】:
-
顺便说一句,
[ $wip_scenarios != 0 ]本身就有问题;必须是[ "$wip_scenarios" != 0 ]——引号不是可选的;将它们关闭可能会导致一些有趣的错误,具体取决于确切的值。 -
顺便说一句,您希望
scenarios中的最后一个s是可选的吗?这就是后面的?正在做的事情;如果你想匹配文字?,最好的方法(恕我直言)是一个字符类:[[:digit:]]+ scenarios[?] -
另外,当你可以使用
''时,不要使用"";使用"\d"与'\d'不同,因为在双引号中,序列被一些shell 扩展,仅替换为"d"。 -
参见 pubs.opengroup.org/onlinepubs/009604499/utilities/grep.html re:
grep -o也不是标准的一部分。 -
感谢查尔斯的所有提示。我确实希望场景中的最后一个's'是可选的,所以
?是故意的。
标签: linux macos ubuntu grep bsd