glob (programowanie) - glob (programming)
W programowaniu komputerowym , glob ( / ɡ l ɑː b / ) wzory określić zestawy z nazwami znaków wieloznacznych . Na przykład polecenie powłoki Unix Bashmv *.txt textfiles/
przenosi ( mv
) wszystkie pliki o nazwach kończących się .txt
na bieżącym katalogu do katalogu textfiles
. Oto *
symbol wieloznaczny oznaczający „dowolny ciąg znaków” i *.txt
jest wzorcem glob. Innym powszechnym symbolem wieloznacznym jest znak zapytania ( ?
), który oznacza jeden znak. Na przykład mv ?.txt shorttextfiles/
przeniesie wszystkie pliki nazwane jednym znakiem, po którym następuje.txt
z bieżącego katalogu do katalogu shorttextfiles
, podczas gdy ??.txt
pasowałby do wszystkich plików, których nazwa składa się z 2 znaków, po których następuje .txt
.
Oprócz dopasowywania nazw plików, do dopasowywania dowolnych łańcuchów (ang. wildcard matching ) powszechnie używane są również globy . W tym charakterze wspólnym interfejsem jest fnmatch
.
Początek
Polecenie glob, skrót od global , pochodzi z najwcześniejszych wersji Uniksa Bell Labs . Interpretery poleceń we wczesnych wersjach Uniksa (od 1 do 6 edycji, 1969-1975) polegały na oddzielnym programie do rozszerzania znaków wieloznacznych w niecytowanych argumentach w poleceniu: /etc/glob . Ten program wykonał rozwinięcie i dostarczył rozszerzoną listę ścieżek plików do polecenia w celu wykonania.
Glob został pierwotnie napisany w języku programowania B . Był to pierwszy element głównego oprogramowania uniksowego, który został opracowany w języku programowania wysokiego poziomu . Później ta funkcjonalność została dostarczona jako C funkcji biblioteki , glob()
używane przez programy takie jak skorupy . Zwykle jest ona definiowana na podstawie funkcji o nazwie fnmatch()
, która sprawdza, czy łańcuch pasuje do danego wzorca - program używający tej funkcji może następnie iterować przez serię łańcuchów (zwykle nazw plików) w celu określenia, które z nich pasują. Obie funkcje są częścią POSIX : funkcje zdefiniowane w POSIX.1 od 2001 roku oraz składnia zdefiniowana w POSIX.2. Pomysł zdefiniowania oddzielnej funkcji dopasowywania zaczął się od wildmat (dopasowania wieloznacznego), prostej biblioteki do dopasowywania ciągów do kulek Bourne Shell.
Tradycyjnie, globy nie dopasowują ukrytych plików w postaci uniksowych plików dotfiles ; aby je dopasować, wzorzec musi jawnie zaczynać się od .
. Na przykład *
dopasowuje wszystkie widoczne pliki, a .*
dopasowuje wszystkie ukryte pliki.
Składnia
Najczęstszymi są symbole wieloznaczne *
, ?
i […]
.
Dzika karta | Opis | Przykład | mecze | Nie pasuje |
---|---|---|---|---|
*
|
pasuje do dowolnej liczby dowolnych znaków, w tym żadnego |
Law*
|
Law , Laws , lubLawyer
|
GrokLaw , La , lubaw
|
*Law*
|
Law , GrokLaw lub Lawyer .
|
La , lub aw
|
||
?
|
pasuje do dowolnego pojedynczego znaku |
?at
|
Cat , cat , Bat lubbat
|
at
|
[abc]
|
pasuje do jednego znaku podanego w nawiasie |
[CB]at
|
Cat lub Bat
|
cat , bat lubCBat
|
[a-z]
|
dopasowuje jeden znak z zakresu (zależnego od lokalizacji) podanego w nawiasie |
Letter[0-9]
|
Letter0 , Letter1 , Letter2 doLetter9
|
Letters , Letter lubLetter10
|
Zwykle znak separatora ścieżki ( /
w systemie Linux/Unix, MacOS itp. lub \
w systemie Windows) nigdy nie zostanie dopasowany. Niektóre powłoki, takie jak Bash, mają funkcjonalność pozwalającą użytkownikom na obejście tego.
Uniksopodobny
Na Unix-like systemów *
, ?
ma wyżej podane znaczenie, gdy […]
ma dwa dodatkowe znaczenie:
Dzika karta | Opis | Przykład | mecze | Nie pasuje |
---|---|---|---|---|
[!abc]
|
dopasowuje jeden znak, który nie jest podany w nawiasie |
[!C]at
|
Bat , bat , lubcat
|
Cat
|
[!a-z]
|
dopasowuje jeden znak spoza zakresu podanego w nawiasie |
Letter[!3-5]
|
Letter1 , Letter2 , Letter6 Do Letter9 i Letterx etc.
|
Letter3 , Letter4 , Letter5 lubLetterxx
|
Zakresy mogą również obejmować wstępnie zdefiniowane klasy znaków, klasy równoważności dla znaków akcentowanych i symbole sortowania dla znaków trudnych do wpisania. Są one zdefiniowane tak, aby pasowały do nawiasów w wyrażeniach regularnych POSIX.
Unix globbing jest obsługiwany przez powłokę zgodnie z tradycją POSIX. Globbing jest dostępny w nazwach plików w wierszu poleceń iw skryptach powłoki . Instrukcja obsługiwana przez POSIX case
w powłokach zapewnia dopasowywanie wzorców przy użyciu wzorców glob.
Niektóre powłoki (takie jak powłoka C i Bash ) obsługują dodatkową składnię znaną jako alternacja lub rozwijanie nawiasów klamrowych . Ponieważ nie jest częścią składni glob, nie jest udostępniana w programie case
. Jest rozwijany tylko w wierszu poleceń przed globbingiem.
Powłoka Bash obsługuje również następujące rozszerzenia:
- Extended globbing (extglob): pozwala na użycie innych operatorów dopasowywania wzorców do dopasowywania wielu wystąpień wzorca zawartego w nawiasach, zasadniczo dostarczając brakującą gwiazdę kleene i alternatywę do opisywania języków regularnych. Można to włączyć, ustawiając
extglob
opcję powłoki. Ta opcja pochodzi z ksh93. GNU fnmatch i glob ma identyczne rozszerzenie. - globstar: pozwala
**
jako składnik nazwy rekursywnie dopasowywać dowolną liczbę warstw nieukrytych katalogów. Obsługiwane również przez biblioteki JS i glob Pythona.
Windows i DOS
Oryginalny DOS był klonem CP/M zaprojektowanym do pracy na procesorach Intel 8088 i 8086 . Powłoki Windows, po DOS, tradycyjnie nie wykonują żadnego rozszerzenia glob w argumentach przekazywanych do programów zewnętrznych. Powłoki mogą używać rozszerzenia dla własnych poleceń wbudowanych:
- Windows PowerShell ma całą wspólną składnię zdefiniowaną powyżej, bez żadnych dodatków.
-
COMMAND.COM i cmd.exe mają większość typowej składni z pewnymi ograniczeniami: nie ma,
[…]
a dla COMMAND.COM*
może pojawić się tylko na końcu wzorca. Nie może pojawić się w środku wzorca, z wyjątkiem bezpośrednio poprzedzającej kropkę separatora rozszerzenia nazwy pliku .
Programy Windows i DOS otrzymują długi ciąg wiersza poleceń zamiast parametrów w stylu argv i ich obowiązkiem jest wykonanie dowolnego dzielenia, cytowania lub rozszerzania glob. Technicznie nie ma ustalonego sposobu opisywania symboli wieloznacznych w programach, ponieważ mogą one robić, co chcą. Dwa popularne ekspandery glob obejmują:
- Ekspander wiersza polecenia Microsoft C Runtime (msvcrt), który obsługuje tylko
?
i*
. Zarówno ReactOS (crt/misc/getargs.c), jak i Wine (msvcrt/data.c) zawierają kompatybilną implementację open-source__getmainargs
funkcji działającej pod maską, w swoim podstawowym CRT. - Cygwin i MSYS
dcrt0.cc
wiersza polecenia ekspander, który używa stylu Unixglob()
rutynowych under-the-kaptur, po rozcięciu argumentów.
Większość innych części systemu Windows, w tym usługa indeksowania, korzysta ze stylu MS-DOS symboli wieloznacznych znajdujących się w CMD. Ta składnia, relikt ery nazw plików 8.3, zwraca szczególną uwagę na kropki we wzorcu i tekście (nazwę pliku). Wewnętrznie odbywa się to za pomocą trzech dodatkowych znaków wieloznacznych, <>"
. Na końcu interfejsu API systemu Windows odpowiednikiem glob() jest FindFirstFile , a fnmatch() odpowiada jego bazowemu RtlIsNameInExpression . (Kolejnym odpowiednikiem fnmatch jest PathMatchSpec .) Oba ekspandery msvcrt o otwartym kodzie źródłowym używają FindFirstFile , więc będą w nich również obowiązywać dziwactwa dotyczące nazw plików 8.3.
SQL
SQL LIKE
Operator ma równoważne ?
i *
, ale nie […]
.
Wspólna karta wieloznaczna | Symbol wieloznaczny SQL | Opis |
---|---|---|
?
|
_
|
pasuje do dowolnego pojedynczego znaku |
*
|
%
|
pasuje do dowolnej liczby dowolnych znaków, w tym żadnego |
Standardowy SQL używa składni podobnej do glob do prostego dopasowywania ciągów w swoim LIKE
operatorze, chociaż termin „glob” nie jest ogólnie używany w społeczności SQL. Znak procentu ( %
) odpowiada zero lub większej liczbie znaków, a podkreślenie ( _
) odpowiada dokładnie jednemu.
Wiele implementacji SQL rozszerzyło LIKE
operator, aby umożliwić bogatszy język dopasowywania wzorców, obejmujący zakresy znaków ( […]
), ich negację i elementy wyrażeń regularnych.
W porównaniu z wyrażeniami regularnymi
Globs nie zawierają składni dla gwiazdy Kleene, która pozwala na wielokrotne powtórzenia poprzedniej części wyrażenia; dlatego nie są uważane za wyrażenia regularne , które mogą opisywać pełny zestaw języków regularnych w dowolnym alfabecie skończonym.
Wspólna karta wieloznaczna | Równoważne wyrażenie regularne |
---|---|
?
|
.
|
*
|
.*
|
Globy próbują dopasować cały ciąg (na przykład S*.DOC
dopasowuje S.DOC i SA.DOC, ale nie POST.DOC ani SURREY.DOCKS), podczas gdy w zależności od szczegółów implementacji wyrażenia regularne mogą pasować do podciągu.
Implementacja jako wyrażenia regularne
Oryginalna implementacja autokonfiguracji proxy Mozilli , która zapewnia funkcję dopasowywania globów na ciągach, używa implementacji replace-as-RegExp, jak powyżej. W takim przykładzie składnia nawiasu jest objęta wyrażeniem regularnym.
Fnmatch Pythona używa bardziej skomplikowanej procedury do przekształcenia wzorca w wyrażenie regularne.
Inne realizacje
Poza zastosowaniami w powłokach, wzorce globs znajdują również zastosowanie w różnych językach programowania, głównie do przetwarzania danych wejściowych przez człowieka. Interfejs w stylu glob do zwracania plików lub interfejs w stylu fnmatch do dopasowywania ciągów można znaleźć w następujących językach programowania:
-
C# ma bibliotekę o nazwie,
Glob
którą można zainstalować przy użyciu NuGet . -
D pełni
globMatch
funkcję wstd.path
module. -
JavaScript posiada bibliotekę o nazwie ,
minimatch
która jest używana wewnętrznie przez npm imicromatch
, rzekomo bardziej zoptymalizowaną, dokładną i bezpieczniejszą implementację globbingu używaną przez babel i przędzę. -
Go posiada
Glob
funkcję wfilepath
pakiecie. -
Java posiada
Files
klasę zawierającą metody operujące na wzorcach glob. -
Haskell posiada
Glob
pakiet z modułem głównymSystem.FilePath.Glob
. Składnia wzorca jest oparta na podzbiorze Zsh . Próbuje zoptymalizować dany wzorzec i powinien być zauważalnie szybszy niż naiwne dopasowanie znak po znaku. -
Perl ma zarówno
glob
funkcję (jak omówiono w książce Larry'ego Walla " Programowanie w Perlu" ) i rozszerzenie Glob, które naśladuje procedurę glob BSD. Nawiasy kątowe Perla mogą być również użyte do globowania:<*.log>
. -
PHP ma
glob
funkcję. -
Python ma
glob
moduł w standardowej bibliotece, który wykonuje dopasowywanie wzorców symboli wieloznacznych na nazwach plików, orazfnmatch
moduł z funkcjami do dopasowywania ciągów lub list filtrowania na podstawie tych samych wzorców wieloznacznych. Guido van Rossum , autor języka programowania Python, napisał i wniósłglob
do BSD Unix procedurę w 1986 roku. Wcześniej były implementacjeglob
, np. w programach ex i ftp w poprzednich wydaniach BSD. -
Ruby ma
glob
metodę dlaDir
klasy, która dopasowuje wzorce wieloznaczne do nazw plików. Kilka bibliotek, takich jak Rant i Rake, udostępniaFileList
klasę, która ma metodę glob lub używa tej metody wFileList.[]
identyczny sposób . - Rust ma bibliotekę o nazwie glob.
-
SQLite posiada
GLOB
funkcję. - Tcl zawiera funkcję globbingu.