首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将“`grep -P`”转换为“`grep -E`”?

问如何将“`grep -P`”转换为“`grep -E`”?
EN

Stack Overflow用户
提问于 2015-06-01 23:54:19
回答 1查看 2.7K关注 0票数 4

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

代码语言:javascript
复制
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,当我使用这样的条件词时,这对我的脚本的其余部分没有帮助:

代码语言:javascript
复制
if [ $wip_scenarios != 0 ];then

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-02 00:01:13

这里给出的正则表达式很简单:将\d更改为[[:digit:]]。

因此:

代码语言:javascript
复制
wip_scenarios=$(grep -Eo '^[[:digit:]]+ scenarios[?]' <report.log | grep -Eo '[[:digit:]]+')

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

代码语言:javascript
复制
# 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]}
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30585212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档