Auf meinem Computer wird macOS 10.12.3 ausgeführt, und ich verwende das vom System installierte grep
Dienstprogramm mit Version 2.5.1-FreeBSD.
Dies sind die Ausgaben, die ich beim Testen verschiedener regulärer Ausdrücke erhalte:
Wenn ich diese aber mit GNU grep (Version 2.25) ausführe, erhalte ich Folgendes:
GNUs grep sieht für mich richtig aus und BSD ist falsch, oder? Warum unterscheiden sie sich? Ich verstehe nicht, warum das grep von BSD mit dem "a" übereinstimmt, wenn der reguläre Ausdruck angibt, dass es dem Zeilenanfang folgen muss.
echo 'bababa' | grep -E '^(a|b)'
alles rot ist. Und Sie haben das gleiche Problem mit -o
. Ich schätze, grep
sucht nach mehreren Übereinstimmungen, aber für die zweite Übereinstimmung und darüber wird der reguläre Ausdruck auf das angewendet, was rechts von der vorherigen Übereinstimmung ( anana
in Ihrem Fall also beim zweiten Mal) steht, ohne dass das Flag REG_NOTBOL übergeben wird. Siehe auchecho banana | grep -Eo '^ban|^ana$'
grep
identifiziert sich @JdeBP als grep (BSD grep) 2.5.1-FreeBSD
Manpage, die sich nur auf GNU bezieht, indem "lange Optionen für die Kompatibilität mit GNU-Versionen" erwähnt werden. Auch kein Urheberrechtsvermerk oder Erwähnungen von GPL (oder FSF). Wenn es Geschichte mit der GNU util hat, ist es schwer zu sagen.
grep
, was in der Antwort von Decade Moon besprochen wird, dass so viele Leute denken, dass es richtig ist, identifiziert sich mit grep (GNU grep) 2.5.1-FreeBSD
(wie in der Bug-Diskussion zu sehen ist), hat einen FSF-Copyright-Hinweis und ist definitiv GNU grep
. Was FreeBSD nennt, bsdgrep
ist OpenBSD Anrufe grep
und ist BSD grep
, ohne --color
Option außerhalb der FreeBSD - Variante das ist , was identifiziert als. grep (BSD grep) 2.5.1-FreeBSD
, und ironischerweise ist das, was eine Person Diskussion im Bug vorgeschlagen , dass FreeBSD - Schalter grep
auf.