Używam RegEx Buddy do tworzenia prototypów i debugowania moich wyrażeń regularnych. RegEx Buddy pozwala mi wybierać spośród wielu różnych typów silników wyrażeń regularnych (.NET, Java, Perl, GNU BRE, GNU ERE, POSIX, BRE, POSIX ERE itp.).
Co robi silnik wyrażeń regularnych użycie basha (na przykład w instrukcjach if
i case
)? Używam 32-bitowego Centosa 5.5 i basha 3.2.25 (1):
[kevin@mon01 scratch]$ bash --version GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc.
Zgaduję, że to będzie GNU BRE czy GNU ERE?
Odpowiedź
bash (i ogólnie powłoki POSIX) nie używają wyrażeń regularnych w case
, a raczej wzorce glob .
Istnieje ograniczona obsługa wyrażeń regularnych używających =~
; zobacz szczegóły pod adresem: http://mywiki.wooledge.org/BashGuide/Patterns ,
który mówi, że bash
używa rozszerzonych wyrażeń regularnych (ERE).
Komentarze
- Dziękujemy. Drugi odsyłacz wspomina o ERE, które, jak sądzę, to GNU ERE.
Odpowiedź
Bash nie używa żadnego z powyższe rodzaje wyrażeń regularnych w instrukcjach if
i case
.
Zamiast tego używa wzorców globalnych powłoki , które są mniej wydajne niż jakiekolwiek wyrażenia regularne. Względnie nowe wersje basha pozwalają również na użycie rozszerzonych wzorców glob, które są wyraźnie równe wyrażeniom regularnym bez (linii) kotwic, ale zawierają negowane terminy, ale mają składnię inną niż wyżej wymienione typy wyrażeń regularnych.
Należy jednak pamiętać, że rozszerzone globy powłoki muszą być włączone przed użyciem z shopt -s extglob
zarówno w skrypcie powłoki, jak i interaktywnie.
W jednym wyjątkowym miejscu, a mianowicie w poleceniu warunkowym [[ ]]
, relacja binarna =~
pozwala sprawdzić ciąg po lewej stronie bok przeciwko rozszerzonemu regularnemu wyrażenie ERE po prawej stronie.
Odpowiedź
Zgodnie z połączonym przewodnikiem po Bash, Bash (od wersji 3.0+) używa: „dialekt Rozszerzone wyrażenia regularne (ERE) .”
Więcej informacji na temat tego dialektu można znaleźć tutaj .