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