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