Różne narzędzia i ich wersje obsługują różne warianty wyrażeń regularnych. Dokumentacja każdego powie ci, co obsługuje.
Istnieją standardy, dzięki którym można polegać na minimalnym zestawie funkcji, które są dostępne we wszystkich zgodnych aplikacjach.
Na przykład wszystkie współczesne implementacje sed
i grep
implementacje podstawowych wyrażeń regularnych określonych przez POSIX (co najmniej jedna wersja standardu, ale ten standard nie ewoluował pod tym względem wiele w ciągu ostatnich kilku dekad).
W POSIX BRE i ERE masz [:alnum:]
klasę znaków. To pasuje do liter i cyfr w twoim języku (pamiętaj, że często zawiera o wiele więcej niż a-zA-Z0-9
chyba, że język to C).
Więc:
grep -x '[[:alnum:]_]\{1,\}'
pasuje do jednej lub więcej alnums lub _.
[\w]
jest wymagany przez POSIX, aby pasował do ukośnika odwrotnego lub w
. Więc nie będzie znaleźć grep
lub sed
wdrożenie gdzie to jest dostępne (chyba poprzez niestandardowe opcje).
Zachowanie dla \w
samego nie jest określone przez POSIX, więc implementacje mogą robić to, co chcą. GNU grep
dodało to dawno temu.
GNU grep
kiedyś posiadało własny silnik wyrażenia regularnego, jednak teraz używa silnika GNU libc (choć osadza własną kopię).
Ma to na celu dopasowanie alnumów i podkreślników w Twoim regionie. Jednak obecnie ma błąd polegający na tym, że dopasowuje tylko znaki jednobajtowe (na przykład nie é w ustawieniach regionalnych UTF-8, nawet jeśli jest to wyraźnie litera i mimo że pasuje do é we wszystkich lokalizacjach, w których é jest pojedynczym postać).
Istnieje również \w
operator wyrażeń regularnych w wyrażeniach regularnych Perla i PCRE. PCRE / perl nie są wyrażeniami regularnymi POSIX, to po prostu kolejna rzecz.
Teraz, gdy GNU grep -P
używa PCRE, ma ten sam problem, co bez niego -P
. Można go jednak obejść, używając (*UCP)
(chociaż ma to również skutki uboczne w lokalizacjach innych niż UTF8).
GNU sed
używa także wyrażeń regularnych GNU libc do własnych wyrażeń regularnych. Używa go w taki sposób, że nie ma tego samego błędu co GNU grep
.
GNU sed
nie obsługuje PCRE. Kod zawiera pewne dowody, że próbowano go już wcześniej, ale wydaje się, że nie jest już w porządku obrad.
Jeśli chcesz mieć wyrażenia regularne Perla, po prostu użyj perl
.
W przeciwnym razie powiedziałbym, że zamiast próbować polegać na fałszywej niestandardowej funkcji twojej konkretnej implementacji sed
/ grep
, lepiej trzymać się standardu i używać [_[:alnum:]]
.
[_[:alnum:]]
Jest to miłe obejście, które pozwala mi przedłużyć go tak jak[\w/]
([_[:alnum:]/]
w tym przypadku).