На моєму комп’ютері працює macOS 10.12.3, і я використовую встановлену системою grepутиліту версії 2.5.1-FreeBSD.
Це результати, які я отримую при тестуванні різних регексів:
Але якщо я запускаю їх за допомогою GNU grep (версія 2.25), я отримую наступне:
Греп GNU мені здається правильним, а BSD - неправильним, ні? Чому вони відрізняються? Я не розумію, чому греп BSD відповідає "a", коли регулярний вираз визначає, що він повинен слідувати початку рядка.
2
Не соромтеся повідомляти про першу поведінку як про помилку.
—
Satō Katsura
Ви побачите, що
—
Стефан Шазелас
echo 'bababa' | grep -E '^(a|b)'все червоне. І у вас буде та сама проблема -o. Я думаю, grepшукає кілька матчів, але для другого матчу і більше, він застосовує регулярне вираження до того, що праворуч від того, що відповідало попередньому разу (так ananaвдруге у вашому випадку), не передаючи прапор REG_NOTBOL. Дивіться такожecho banana | grep -Eo '^ban|^ana$'
@JdeBP, на моїй ОС 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 .

