Мой компьютер работает под управлением 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 .