Мой компьютер работает под управлением macOS 10.12.3, и я использую установленную в системе grepутилиту с версией 2.5.1-FreeBSD.
Вот результаты, которые я получаю при тестировании различных регулярных выражений:
Но если я запускаю их, используя GNU grep (версия 2.25), я получаю следующее:
GNU grep выглядит правильно для меня, а BSD неверно, нет? Почему они отличаются? Я не понимаю, почему grep BSD соответствует «a», когда регулярное выражение указывает, что оно должно следовать за началом строки.
2
Не стесняйтесь сообщать о первом поведении как об ошибке.
—
Satō
Вы увидите, что
—
Стефан Шазелас
echo 'bababa' | grep -E '^(a|b)'все это красное. И у вас будет такая же проблема -o. Я думаю, grepищет несколько совпадений, но для второго совпадения и более, он применяет регулярное выражение к тому, что находится справа от того, что совпадало с предыдущим временем (и так ananaво втором случае в вашем случае), не пропуская флаг REG_NOTBOL. Смотрите такжеecho banana | grep -Eo '^ban|^ana$'
@JdeBP, на моей OS X,
—
ilkkachu
grepидентифицирует себя как grep (BSD grep) 2.5.1-FreeBSDсо страницей руководства, ссылающейся только на GNU, упоминая «длинные опции, предоставляемые для совместимости с версиями GNU». Кроме того, нет уведомления об авторских правах или упоминаний о GPL (или FSF). Если у него есть история с утилитой GNU, трудно сказать.
Мы демонстрируем, как это вводит в заблуждение. (-: То,
—
JdeBP
grepчто обсуждается в ответе Десятилетия Луны, о котором многие думают, что это правильно, идентифицирует как grep (GNU grep) 2.5.1-FreeBSD(как можно увидеть в обсуждении ошибок), имеет уведомление об авторских правах FSF и, безусловно, GNU grep. То, что FreeBSD называет, bsdgrepэто то, что OpenBSD вызывает grepи является BSD grep, без --colorопций вне варианта FreeBSD. Это то, что идентифицирует как grep (BSD grep) 2.5.1-FreeBSD, и по иронии судьбы это то, что один человек в обсуждении ошибок предложил переключиться grepна FreeBSD .

