BSD grep "?"альтернатива подстановочного знака для GNU - PullRequest
2 голосов
/ 06 апреля 2019

У меня есть команда 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 '^[^,]*'

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

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

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

$ MY_VAR='s3://model/,s3://another/model'
$ echo "$MY_VAR" | grep -Eo 's3[^,]+model'
s3://model
s3://another/model
1 голос
/ 06 апреля 2019

Вы можете использовать опцию регулярного выражения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...