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

标签 linux macos ubuntu grep bsd

我有一个在 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/

相关文章:

java - 以编程方式(在 Java 中)防止 OS X 进入休眠状态

macos - 自制程序:“ curl :(60)SSL证书:无法获取本地发行者证书”

php - unoconv 使用 www-data 从终端工作,而不是从 php 脚本也作为 www-data

linux - phpunit.xml 的位置/路径

c - Linux - 如何将代码上传到主板上的专用飞思卡尔芯片 NIC?

android - 在 Linux 上使用 ADB 安装多个 APK

objective-c - 如何使用 Obj-C 轻松保存窗口大小和位置状态?

linux - Nagios 验证 Sharepoint

php - 无法在 SVN 存储库中运行 PHP 文件

ubuntu - docker 500 错误