На моєму комп’ютері працює 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 .