BSD grep“?” GNU的通配符替代

时间:2019-04-06 19:24:56

标签: macos ubuntu grep

我有一个grep命令,该命令可以在Mac上的BSD grep 2.5.1-FreeBSD上运行,我正在使用它来搜索一个很长的单行bash var:

echo $MY_VAR | grep -Eo s3.+?model

在具有GNU grep 2.25的Ubuntu上,?通配符似乎不起作用。它不会在首次出现“模型”时停止。

有人可以告诉我如何在Ubuntu中获得相同的比赛吗?打开即可更改模式或安装其他/更新的grep。

不会列出我到目前为止尝试过的100万种模式,但是为此苦苦挣扎了一段时间。

编辑:由于“模型”后面有一个“,”,因此以下内容似乎可以使用,但看起来很丑陋:

egrep -o 's3.*model' | grep -o '^[^,]*'

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以在GNU P中使用PCRE regex选项grep,它还允许使用非贪婪量词:

echo $MY_VAR | grep -Po s3.+?model
                     ^

请参见online demo

MY_VAR="s3://model/;s3://another/model"
echo $MY_VAR | grep -Po 's3.+?model'
# => s3://model
#    s3://another/model

答案 1 :(得分:1)

借用Wiktor的示例,并考虑与逗号相关的注释和代码,这听起来像是任何针对ERE的-E的grep所希望的:

$ MY_VAR='s3://model/,s3://another/model'
$ echo "$MY_VAR" | grep -Eo 's3[^,]+model'
s3://model
s3://another/model