/ / Dopasowywanie pierwszej litery w każdym wierszu (UNIX egrep) - regex, macos, unix, grep

Dopasowywanie pierwszej litery w każdym wierszu (UNIX egrep) - regex, macos, unix, grep

Chcę dopasować i wrócić tylko pierwszyznak z każdej linii w pliku zakodowanym za pomocą zwykłego tekstu utf-8 za pomocą terminala UNIX za pomocą egrep. Podejrzewałem, że następujące polecenie egrep z prostym RegEx przyniosłoby pożądany rezultat:

egrep -o "^." FILE.txt

Jednak dane wyjściowe wydają się pasować i powracać każdy znak w pliku; to znaczy zachowuje się tak, jakby polecenie brzmiało:

egrep -o "." FILE.txt

Podobne wyniki występują z następującym poleceniem,

egrep -o "^[a-z]" FILE.txt

mianowicie wyniki zachowują się tak, jakby dostarczono RegEx "[a-z]" (to znaczy, że każdy znak ASCII małej litery w zakresie a-z jest dopasowany).

Polecenia, w których podano tylko jeden określony alfanumeryczny znak, wydają się, zgodnie z oczekiwaniami, zwracać każdą linię zaczynającą się od określonego znaku, np.

egrep -o "^1" FILE.txt

lub egrep -o "^ T" FILE.txt

zwraca wszystkie linie zaczynające się odpowiednio od "1" lub "T".

Próbowałem wkleić cały plik do testera RegEx, na przykład na https://regexr.com/i wyrażenie "^." rzeczywiście zachowuje się zgodnie z oczekiwaniami, więc nie sądzę, że mój plik ma jakiekolwiek dalsze białe znaki, które mogłyby przeszkadzać.

Czy jest jakieś inne zachowanie metaznaku "^" zaczynającego się od linii z egrep, który może być przyczyną tego problemu?

Odpowiedzi:

1 dla odpowiedzi № 1

To jest znany błąd w BSD grep i GNU grep 2.5.1-FreeBSD (omówione również tutaj).

W -o tryb, ^ kotwica nie jest prawidłowo obsługiwana (zgłaszane tutaj, załatany tutaj):

$ echo abc | bsdgrep -o "^."
a
b
c

GNU ANTYLOPA grep w systemie Linux zachowuje się zgodnie z oczekiwaniami:

$ echo abc | grep -o "^."
a

Powiązane z tym, co próbujesz osiągnąć tutaj (wydrukuj pierwszy znak każdy linia), grep to przesada. Prosty cut wystarczyłoby:

$ echo abc | cut -c1
a