我有一个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 '^[^,]*'
有更好的方法吗?
答案 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