BSD grep "?" альтернатива подстановочным знакам для GNU

У меня есть команда grep, которая работает на моем Mac с BSD grep 2.5.1-FreeBSD, которую я использую для поиска очень длинной однострочной переменной bash:

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

В Ubuntu с GNU grep 2.25 подстановочный знак ?, похоже, не работает. Это не останавливается на первом появлении «модели».

Кто-нибудь, пожалуйста, покажите мне, как получить такое же совпадение в Ubuntu? Откройте для себя либо изменение шаблона, либо установку другого/обновленного grep.

Не буду перечислять миллион шаблонов, которые я пробовал до сих пор, но какое-то время боролся с этим.

Редактировать: Следующее, кажется, работает, так как есть "," после "модели", но выглядит довольно уродливо:

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

Есть ли способ лучше?

Спасибо, да, у меня нет опыта работы с perl или ruby, в основном я программист на python/C. Возможно ли вообще просто установить BSD grep на Ubuntu?

Austin 06.04.2019 22:17

Попробуйте grep -Po s3.+?model

Wiktor Stribiżew 06.04.2019 22:19

@WiktorStribiżew Сработало, спасибо!!!

Austin 06.04.2019 22:35

@EdMorton понятия не имею .. используя MBP 2017 года с macOS Mojave 10.14.2 (18C54) и grep по умолчанию, с которым он поставляется, по-видимому, BSD grep 2.5.1-FreeBSD.

Austin 07.04.2019 22:37
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
4
136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать параметр регулярного выражения PCRE P с GNU grep, он также позволяет использовать нежадные квантификаторы:

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

См. онлайн демо:

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

Заимствуя пример Виктора и учитывая ваш комментарий и код, связанный с запятыми, похоже, что это то, что вы хотите с любым grep, у которого есть -E для ERE:

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

Другие вопросы по теме