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 № 1To 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