Na moim komputerze działa system macOS 10.12.3 i korzystam z grep
narzędzia zainstalowanego w systemie w wersji 2.5.1-FreeBSD.
Oto wyniki, które otrzymuję podczas testowania różnych wyrażeń regularnych:
Ale jeśli uruchomię je za pomocą GNU grep (wersja 2.25), otrzymam:
Grep GNU wydaje mi się poprawny, a BSD jest niepoprawny, nie? Dlaczego się różnią? Nie rozumiem, dlaczego grep BSD pasuje do „a”, gdy regex określa, że musi on występować na początku linii.
echo 'bababa' | grep -E '^(a|b)'
wszystko jest czerwone. I będziesz miał ten sam problem z -o
. Wydaje mi się, że grep
szuka wielu dopasowań, ale dla drugiego dopasowania i więcej, stosuje anana
wyrażenie regularne do tego, co jest po prawej stronie tego, co pasowało poprzednio (tak jak w twoim przypadku po raz drugi), nie przekazując flagi REG_NOTBOL. Zobacz takżeecho banana | grep -Eo '^ban|^ana$'
grep
identyfikuje się grep (BSD grep) 2.5.1-FreeBSD
ze stroną podręcznika odnoszącą się do GNU tylko przez wspomnienie o „długich opcjach zapewniających kompatybilność z wersjami GNU”. Ponadto nie ma informacji o prawach autorskich ani wzmianek o GPL (lub FSF). Jeśli ma historię związaną z użytkowaniem GNU, trudno powiedzieć.
grep
co jest omówione w odpowiedzi Decade Moon, że tak wielu ludzi uważa, że jest poprawne, identyfikuje jako grep (GNU grep) 2.5.1-FreeBSD
(jak widać w dyskusji o błędach), ma informację o prawach autorskich FSF i jest zdecydowanie GNU grep
. To, co nazywa FreeBSD, bsdgrep
jest tym, co OpenBSD wywołuje grep
i jest BSD grep
, bez żadnej --color
opcji poza wariantem FreeBSD. To właśnie identyfikuje grep (BSD grep) 2.5.1-FreeBSD
i, jak na ironię, jedna osoba w dyskusji o błędzie sugeruje, aby FreeBSD grep