grep
Idea postaci zależy od regionu . Jeśli znajdujesz się w ustawieniach regionalnych innych niż Unicode i grepujesz z pliku zawierającego znaki Unicode, liczba znaków nie będzie zgodna. Jeśli tak echo $LANG
, zobaczysz lokalizację, w której się znajdujesz.
Jeśli ustawisz zmienne środowiskowe LC_CTYPE
i / lub LANG
środowiskowe na wartość kończącą się na „.UTF-8”, uzyskasz właściwe zachowanie:
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
Możesz zmienić ustawienia regionalne dla pojedynczego polecenia, przypisując zmienną do tego samego wiersza, co polecenie.
W tej konfiguracji znaki wielobajtowe są traktowane jako pojedyncze znaki. Jeśli chcesz całkowicie wykluczyć znaki spoza ASCII, niektóre inne odpowiedzi mają dla Ciebie odpowiednie rozwiązania.
Zauważ, że nadal możliwe jest, że coś się zepsuje, a przynajmniej nie zrobi dokładnie tego, czego oczekujesz, w obecności połączonych postaci . Twój grep
może traktować Łacińska mała litera E + łącząc CHARACTER ostrego powyżej odmiennie niż Łacińska mała litera E z ostrą.
.
, coś podobnegowăsd's
będzie pasować'
jest znakiem, który może być rozsądnie częścią „łańcucha ze stałą liczbą znaków”.LC_CTYPE
aLANG
coś takiegoLC_CTYPE=en_US.UTF-8 LANG=en_US
zawiedzie. UżyjLC_ALL
dla bezpieczeństwa.Spróbuj tego:
-x
służy do dopasowania całej linii i zdefiniowanej przez POSIX (patrz grep ).Zobacz tutaj dobre wyjaśnienie tego, co
LC_ALL
robi. Możesz ustawićLANG
lubLC_CTYPE
użyć utf-8, aby uzyskać takie samo zachowanie. Wpływ na przyjmowanie zamówień jestLC_ALL
=>LANG
=>LC_CTYPE
.źródło
Z GNU,
grep
gdy jest zbudowany z obsługą PCRE, możesz:Podczas gdy
.
pasuje do znaku,\X
pasuje do ideogramu / wykresu.W lokalizacji UTF-8:
W tym ostatnim
études
jest 7 znaków, 8 bajtów i 6 grafemów.źródło
echo épée | grep -Px '\X{6}'
ouputépée
é
powyższe zostały zakodowane w UTF-8).Możesz spróbować czegoś takiego:
grep "^[A-Za-z]\{6\}$" myfile.txt
lub jeśli słowa mogą również zawierać liczby, wówczas:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
Po prostu dodaj do nawiasów kwadratowych dowolne znaki oprócz nich.
źródło
étude
, ponieważ znak ASCII odpowiadający akcentowi zepsuje regex.