В компьютерном программировании , GLOB образцы определяют множество имен файлов с символами подстановки . Например, Unix Bash оболочки команда mv *.txt textfiles/
движется ( mv
) все файлы с именами , заканчивающихся .txt
из текущего каталога в каталог textfiles
. Здесь *
подстановочный знак означает «любую строку символов» и *.txt
представляет собой шаблон глобуса. Другой распространенный подстановочный знак - это вопросительный знак ( ?
), обозначающий один символ. Например, mv ?.txt shorttextfiles/
переместит все файлы, названные одним символом, за которым следует .txt
из текущего каталога в каталог shorttextfiles
, в то время как??.txt
будет соответствовать всем файлам, имя которых состоит из 2 символов, за которыми следует .txt
.
Помимо сопоставления имен файлов, глобусы также широко используются для сопоставления произвольных строк ( сопоставление с подстановочными знаками ). В этом качестве есть общий интерфейс fnmatch
.
Источник
Команда glob, сокращенно от global , возникла в самых ранних версиях Unix Bell Labs . [1] Командные интерпретаторы ранних версий Unix (с 1-го по 6-е издания, 1969–1975) полагались на отдельную программу для преобразования подстановочных знаков в аргументах без кавычек в команду: / etc / glob . Эта программа выполнила расширение и предоставила расширенный список путей к файлам для команды для выполнения.
Glob был изначально написан на языке программирования B . Это была первая часть основного программного обеспечения Unix, разработанная на языке программирования высокого уровня . [2] Позже эта функциональность была предоставлена как функция библиотеки C , glob()
используемая такими программами, как оболочка . Обычно он определяется на основе названной функции fnmatch()
, которая проверяет, соответствует ли строка заданному шаблону - программа, использующая эту функцию, может затем перебирать серию строк (обычно имена файлов), чтобы определить, какие из них совпадают. Обе функции являются частью POSIX : функции, определенные в POSIX.1 с 2001 года, и синтаксис, определенный в POSIX.2. [3] [4] Идея определения отдельной функции сопоставления началась с подстановочного знака ( сопоставление с подстановочными знаками), простой библиотеки для сопоставления строк с глобами Bourne Shell.
Традиционно глобусы не соответствуют скрытым файлам в виде файлов точек Unix ; чтобы соответствовать им, шаблон должен явно начинаться с .
. Например, *
соответствует всем видимым файлам, а .*
соответствует всем скрытым файлам.
Синтаксис
Наиболее распространенными являются маски *
, ?
и […]
.
Подстановочный знак | Описание | Пример | Спички | Не совпадает |
---|---|---|---|---|
* | соответствует любому количеству любых символов, включая ни одного | Law* | Law , Laws ИлиLawyer | GrokLaw , La Илиaw |
*Law* | Law ,, GrokLaw или Lawyer . | La , или же aw | ||
? | соответствует любому одиночному символу | ?at | Cat , cat , Bat Илиbat | at |
[abc] | соответствует одному символу, указанному в скобках | [CB]at | Cat или же Bat | cat , bat илиCBat |
[a-z] | соответствует одному символу из (зависящего от локали) диапазона, указанного в скобках | Letter[0-9] | Letter0 , Letter1 , Letter2 ДоLetter9 | Letters , Letter илиLetter10 |
Обычно символ разделителя пути ( /
в Linux / Unix, MacOS и т. Д. Или \
в Windows) никогда не будет совпадать. Некоторые оболочки, такие как Bash, имеют функции, позволяющие пользователям обойти это. [5]
Unix-подобный
На Unix-подобных системах *
, ?
определяется как указано выше , в то время как […]
имеет два дополнительных значения: [6] [7]
Подстановочный знак | Описание | Пример | Спички | Не совпадает |
---|---|---|---|---|
[!abc] | соответствует одному символу, не указанному в скобках | [!C]at | Bat , bat Илиcat | Cat |
[!a-z] | соответствует одному символу, который не входит в диапазон, указанный в скобках | Letter[!3-5] | Letter1 , Letter2 , Letter6 До Letter9 и Letterx т.д. | Letter3 , Letter4 , Letter5 ИлиLetterxx |
Диапазоны также могут включать предопределенные классы символов, классы эквивалентности для символов с диакритическими знаками и символы сопоставления для символов, которые трудно ввести. Они определены в соответствии со скобками в регулярных выражениях POSIX. [6] [7]
Подстановки Unix обрабатываются оболочкой в соответствии с традициями POSIX. Подстановка имен файлов обеспечивается в командной строке и в сценариях оболочки . [8] Утвержденный POSIX case
оператор в оболочках обеспечивает сопоставление с шаблоном с использованием глобальных шаблонов.
Некоторые оболочки (например, оболочка C и Bash ) поддерживают дополнительный синтаксис, известный как чередование или расширение скобок . Поскольку он не является частью синтаксиса glob, он не предоставляется в case
. Он раскрывается только в командной строке перед подстановкой.
Оболочка Bash также поддерживает следующие расширения: [9]
- Расширенная подстановка (extglob): позволяет использовать другие операторы сопоставления с образцом для сопоставления нескольких вхождений образца, заключенного в круглые скобки, по существу обеспечивая отсутствующую звездочку клини и альтернативу для описания обычных языков. Его можно включить, установив параметр
extglob
оболочки. Такой вариант пришел от кш93. [10] GNU fnmatch и glob имеют одинаковое расширение. [3] - globstar: позволяет
**
самостоятельно в качестве компонента имени рекурсивно сопоставлять любое количество слоев нескрытых каталогов. [10] Также поддерживается библиотеками JS и Python glob.
Windows и DOS
Первоначальная DOS была клоном CP / M, разработанной для работы с процессорами Intel 8088 и 8086 . Оболочки Windows, следующие за DOS, традиционно не выполняют никаких глобальных расширений в аргументах, передаваемых во внешние программы. Оболочки могут использовать расширение для своих собственных встроенных команд:
- Windows PowerShell имеет весь общий синтаксис, определенный, как указано выше, без каких-либо дополнений. [11]
- COMMAND.COM и cmd.exe имеют большую часть общего синтаксиса с некоторыми ограничениями: его нет,
[…]
а для COMMAND.COM он*
может появляться только в конце шаблона. Он не может появляться в середине шаблона, кроме как непосредственно перед точкой разделителя расширения имени файла .
Программы Windows и DOS получают длинную строку командной строки вместо параметров в стиле argv, и в их обязанности входит выполнение любого разделения, цитирования или расширения глобуса. Технически не существует фиксированного способа описания подстановочных знаков в программах, поскольку они могут делать то, что хотят. Два распространенных расширителя глобусов включают: [12]
- Расширитель командной строки Microsoft C Runtime (msvcrt), который поддерживает только
?
и*
. [13] И ReactOS (crt / misc / getargs.c), и Wine (msvcrt / data.c) содержат совместимую реализацию с открытым исходным кодом__getmainargs
функции, работающей под капотом, в их ядре CRT. - Cygwin и MSYS
dcrt0.cc
командной строки расширитель, который использует Unix-стилеglob()
рутина под капотом, после разделения аргументов.
Большинство других частей Windows, включая службу индексирования, используют подстановочные знаки в стиле MS-DOS, найденные в CMD. Этот синтаксис, являющийся пережитком возраста имени файла 8.3, уделяет особое внимание точкам в шаблоне и тексте (имя файла). Внутренне это делается с помощью трех дополнительных символов подстановки, <>"
. В конце Windows API эквивалент glob () выглядит так: FindFirstFile и fnmatch () соответствует своему базовому РтлиснамеInExpression . [14] (Другой аналог fnmatch - PathMatchSpec .) Оба модуля расширения msvcrt с открытым исходным кодом используют FindFirstFile , поэтому в них также будут применяться причуды имени файла 8.3.
SQL
Оператор SQL LIKE
имеет эквивалент ?
и, *
но не имеет […]
.
Общий подстановочный знак | Подстановочный знак SQL | Описание |
---|---|---|
? | _ | соответствует любому одиночному символу |
* | % | соответствует любому количеству любых символов, включая ни одного |
Стандартный SQL использует синтаксис типа glob для простого сопоставления строк в своем LIKE
операторе, хотя термин «glob» обычно не используется в сообществе SQL. Знак процента ( %
) соответствует нулю или большему количеству символов, а знак подчеркивания ( _
) соответствует ровно одному.
Многие реализации SQL расширили LIKE
оператор, чтобы обеспечить более богатый язык сопоставления с образцом, включая диапазоны символов ( […]
), их отрицание и элементы регулярных выражений. [15]
По сравнению с регулярными выражениями
Globs не включают синтаксис для звезды Kleene, который допускает многократное повторение предыдущей части выражения; таким образом, они не считаются регулярными выражениями , которые могут описывать полный набор регулярных языков в любом заданном конечном алфавите. [16]
Общий подстановочный знак | Эквивалентное регулярное выражение |
---|---|
? | . |
* | .* |
Globs пытается сопоставить всю строку (например, S*.DOC
соответствует S.DOC и SA.DOC, но не POST.DOC или SURREY.DOCKS), тогда как, в зависимости от деталей реализации, регулярные выражения могут соответствовать подстроке.
Реализация как регулярные выражения
Исходная реализация автоконфигурации прокси-сервера Mozilla , которая предоставляет функцию сопоставления глобусов для строк, использует реализацию replace-as-RegExp, как указано выше. В таком примере синтаксис скобок покрывается регулярным выражением.
Python fnmatch использует более сложную процедуру для преобразования шаблона в регулярное выражение. [17]
Другие реализации
Помимо использования в оболочках, шаблоны globs также находят применение во множестве языков программирования, в основном для обработки ввода, вводимого человеком. Интерфейс в стиле glob для возврата файлов или интерфейс в стиле fnmatch для сопоставления строк можно найти в следующих языках программирования:
- В C # есть библиотека,
Glob
которую можно установить с помощью NuGet . [18] - D имеет
globMatch
функцию вstd.path
модуле. [19] - В JavaScript есть библиотека,
minimatch
которая используется внутри npm , иmicromatch
якобы более оптимизированная, точная и безопасная реализация глобализации, используемая babel и yarn. [20] [21] - Go имеет
Glob
функцию вfilepath
упаковке. [22] - В Java есть
Files
класс, содержащий методы, которые работают с шаблонами глобусов. [23] - В Haskell есть
Glob
пакет с основным модулемSystem.FilePath.Glob
. Синтаксис шаблона основан на подмножестве Zsh . Он пытается оптимизировать данный шаблон и должен быть заметно быстрее, чем наивное посимвольное сопоставление. [24] - Perl имеет как
glob
функцию (как описано в книге Ларри Уолла « Программирование Perl» ), так и расширение Glob, которое имитирует подпрограмму глобуса BSD. [25] Угловые скобки в Perl могут быть использованы для шарика , а также:<*.log>
. - У PHP есть
glob
функция. [26] - В
glob
стандартной библиотеке Python есть модуль, который выполняет сопоставление шаблонов с подстановочными знаками в именах файлов [27], иfnmatch
модуль с функциями сопоставления строк или списков фильтрации на основе тех же шаблонов с подстановочными знаками. [17] Гвидо ван Россум , автор языка программирования Python, написал и внесglob
подпрограмму в BSD Unix в 1986 году. [28] Существовали предыдущие реализацииglob
, например, в программах ex и ftp в предыдущих выпусках BSD. - В Ruby есть
glob
метод дляDir
класса, который выполняет сопоставление шаблонов с подстановочными знаками в именах файлов. [29] Некоторые библиотеки, такие как Rant и Rake, предоставляютFileList
класс, у которого есть метод glob, или используют этот методFileList.[]
идентично. - SQLite имеет
GLOB
функцию. - Tcl содержит возможность подстановки. [30]
Смотрите также
- Регулярное выражение
- Подстановочный знак
- Подстановочные знаки соответствия
Рекомендации
- ^ "Раздел" Разное "Руководства по Unix Первого издания (PDF)" (PDF) . Архивировано из оригинала (PDF) на 2000-08-29 . Проверено 11 мая 2011 .
- ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (технический отчет). CSTR. Bell Labs. 139.
- ^ a b - Руководство программиста Linux - Библиотечные функции
- ^ - Руководство программиста Linux - Функции библиотеки
- ^ [ https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching Справочное руководство по Bash
- ^ а б «Базовые спецификации Open Group, выпуск 7 IEEE Std 1003.1, издание 2013 г., 2.13. Нотация сопоставления с образцом» .
- ^ а б "Руководство программиста Linux, GLOB (7)" .
- ^ В "Advanced Bash-Scripting Guide, Chapter 19.2: Globbing" (Mendel Cooper, 2003) есть краткий набор примеров шаблонов подстановки имен файлов.
- ^ «Баш глобусы» . База знаний greg bash . Проверено 25 ноября 2019 .
- ^ а б «Сопоставление с образцом» . Справочное руководство по Bash .
- ^ «Поддержка подстановочных знаков в параметрах командлета» . Microsoft . Сеть разработчиков Microsoft.
- ^ «Расширение подстановочного знака» . Сеть разработчиков Microsoft. 2013.
- ^ «Расширение подстановочного знака» . docs.microsoft.com .
- ^ Подстановочные знаки в Windows . MSDN Devblog.
- ^ «КАК (Transact-SQL)» .
- ^ Хопкрофт, Джон Э .; Мотвани, Раджив; Ульман, Джеффри Д. (2000). Введение в теорию автоматов, языки и вычисления (2-е изд.). Эддисон-Уэсли.
- ^ а б "Lib / fnmatch.py" . Python. 2019-11-24 . Проверено 24 ноября 2019 .
- ^ "ктомпсон / глоб" . GitHub . Проверено 6 ноября 2020 .
- ^ "std.path - Язык программирования D - Цифровой Марс" . dlang.org . Проверено 8 сентября 2014 .
- ^ "isaacs / minimatch" . GitHub . Проверено 10 августа 2016 .
- ^ «Йоншлинкерт / микроматч» . GitHub . Проверено 4 апреля 2017 .
- ^ «Путь к файлу пакета - язык программирования Go» . Golang.org . Проверено 11 мая 2011 .
- ^ «Файловые операции» . Oracle . Проверено 16 декабря 2013 .
- ^ «Глоб-0.7.4: Глобальная библиотека» . Проверено 7 мая 2014 .
- ^ "File :: Glob - расширение Perl для подпрограммы BSD glob" . perldoc.perl.org . Проверено 11 мая 2011 .
- ^ "glob - Руководство" . PHP. 2011-05-06 . Проверено 11 мая 2011 .
- ^ «10.7. Glob - расширение шаблона имени пути в стиле Unix - документация Python v2.7.1» . Docs.python.org . Проверено 11 мая 2011 .
- ^ « „ Библиотека рутина подстановка“» . Архивировано из оригинала на 2007-12-19 . Проверено 11 мая 2011 .
- ^ "Класс: Dir" . Ruby-doc.org . Проверено 11 мая 2011 .
- ^ "Страница руководства по TCL glob" . Проверено 16 ноября 2011 .