Glob (программирование) - Википедия - glob (programming)

В компьютерное программирование, шарик шаблоны определяют наборы имен файлов с символы подстановки. Например, Unix Оболочка Bash команда mv * .txt текстовые файлы / движется (мв) все файлы с именами, заканчивающимися на .текст из текущего каталога в каталог текстовые файлы. Здесь, * подстановочный знак, обозначающий "любой нить персонажей "и *.текст это шаблон шара. Другой распространенный подстановочный знак - это вопросительный знак (?), что означает один символ.

Помимо сопоставления имен файлов, глобусы также широко используются для сопоставления произвольных строк (сопоставление с подстановочными знаками ). В этом качестве общий интерфейс fnmatch.

Источник

Скриншот исходной справочной страницы Unix 1971 года для шарик - собственник дмр, Короче для Деннис Ричи.

Команда 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

В реж команда с шаблоном глобуса в IBM PC 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 расширитель командной строки, который использует стиль unix glob () рутина под капотом, после разделения аргументов.

Большинство других частей 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]

Смотрите также

Рекомендации

  1. ^ "Раздел" Разное "руководства по Unix Первого издания (PDF)" (PDF). Архивировано из оригинал (PDF) на 2000-08-29. Получено 2011-05-11.
  2. ^ Макилрой, М.Д. (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Bell Labs. 139.
  3. ^ а б fnmatch (3) – Linux Программиста Руководство - Библиотечные функции
  4. ^ шарик (3) – Linux Программиста Руководство - Библиотечные функции
  5. ^ а б «Базовые спецификации Open Group, выпуск 7 IEEE Std 1003.1, издание 2013 г., 2.13. Нотация сопоставления с образцом».
  6. ^ а б "Руководство программиста Linux, GLOB (7)".
  7. ^ В «Advanced Bash-Scripting Guide, Глава 19.2: Globbing» (Mendel Cooper, 2003) есть краткий набор примеров шаблонов подстановки имен файлов.
  8. ^ "Баш глобусы". база знаний greg's bash. Получено 2019-11-25.
  9. ^ а б «Соответствие шаблону». Справочное руководство по Bash.
  10. ^ «Поддержка подстановочных знаков в параметрах командлета». Microsoft. Сеть разработчиков Microsoft.
  11. ^ «Расширение с подстановочными знаками». Сеть разработчиков Microsoft. 2013.
  12. ^ «Расширение с подстановочными знаками». docs.microsoft.com.
  13. ^ Подстановочные знаки в Windows. MSDN Devblog.
  14. ^ "LIKE (Transact-SQL)".
  15. ^ Хопкрофт, Джон Э .; Мотвани, Раджив; Ульман, Джеффри Д. (2000). Введение в теорию автоматов, языки и вычисления (2-е изд.). Эддисон-Уэсли.
  16. ^ а б "Lib / fnmatch.py". Python. 2019-11-24. Получено 2019-11-24.
  17. ^ "kthompson / glob". GitHub. Получено 2020-11-06.
  18. ^ "std.path - Язык программирования D - Цифровой Марс". dlang.org. Получено 2014-09-08.
  19. ^ "isaacs / minimatch". GitHub. Получено 2016-08-10.
  20. ^ "jonschlinkert / микроматч". GitHub. Получено 2017-04-04.
  21. ^ "Путь к файлу пакета - язык программирования Go". Golang.org. Получено 2011-05-11.
  22. ^ «Файловые операции». Oracle. Получено 2013-12-16.
  23. ^ "Glob-0.7.4: Глобальная библиотека". Получено 2014-05-07.
  24. ^ "File :: Glob - расширение Perl для подпрограммы BSD glob". perldoc.perl.org. Получено 2011-05-11.
  25. ^ "glob - Руководство". PHP. 2011-05-06. Получено 2011-05-11.
  26. ^ "10.7. Glob - расширение шаблона имени пути в стиле Unix - документация Python v2.7.1". Docs.python.org. Получено 2011-05-11.
  27. ^ "'Глобальная библиотечная процедура ". Архивировано из оригинал на 2007-12-19. Получено 2011-05-11.
  28. ^ "Класс: Dir". Ruby-doc.org. Получено 2011-05-11.
  29. ^ "Страница руководства по TCL glob". Получено 2011-11-16.