глобус (программирование)
В компьютерном программировании шаблоны glob ( / ɡ l ɒ b / ) определяют наборы имен файлов с подстановочными знаками . Например, оболочки Unix Bash команда mv *.txt textfiles/
перемещает все файлы с именами, заканчивающимися на .txt
из текущего каталога в каталог textfiles
. Здесь, *
является подстановочным знаком и *.txt
это шаблон глобуса. Подстановочный знак *
означает «любая строка любой длины, включая пустую, но исключая символы-разделители пути ( /
в Unix и \
в окнах)".
Другой распространенный подстановочный знак — вопросительный знак ( ?
), который обозначает один символ. Например, mv ?.txt shorttextfiles/
переместит все файлы, имена которых состоят из одного символа, за которым следует .txt
из текущего каталога в каталог shorttextfiles
, пока ??.txt
будет соответствовать всем файлам, имя которых состоит из двух символов, за которыми следует .txt
.
Помимо сопоставления имен файлов, globs также широко используются для сопоставления произвольных строк ( сопоставление с подстановочными знаками ). В этом качестве общий интерфейс fnmatch
.
Источник
[ редактировать ]Команда glob, сокращение от global от 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.
Традиционно globs не соответствуют скрытым файлам в форме точечных файлов 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
Оператор в оболочках обеспечивает сопоставление с образцом с использованием шаблонов glob.
Некоторые оболочки (например, оболочка C и Bash ) поддерживают дополнительный синтаксис, известный как чередование или расширение скобок . Поскольку он не является частью синтаксиса glob, он не предусмотрен в case
. Он расширяется только в командной строке перед подстановкой.
Оболочка Bash также поддерживает следующие расширения: [9]
- Расширенное подстановка (extglob): позволяет использовать другие операторы сопоставления шаблонов для сопоставления нескольких вхождений шаблона, заключенного в круглые скобки, по существу обеспечивая недостающую звездочку Клини и чередование для описания обычных языков. Его можно включить, установив
extglob
вариант оболочки. Эта опция пришла от ksh93. [10] GNU fnmatch и glob имеют идентичное расширение. [3] - globstar: позволяет
**
сам по себе как компонент имени для рекурсивного сопоставления любого количества слоев нескрытых каталогов. [10] Также поддерживается библиотеками JS и Python . glob
Windows и ДОС
[ редактировать ]Оригинальная DOS была клоном CP/M, предназначенным для работы на процессорах Intel 8088 и 8086 . Оболочки Windows, следуя за DOS, традиционно не выполняют каких-либо расширений в аргументах, передаваемых внешним программам. Оболочки могут использовать расширение для своих собственных встроенных команд:
- Windows PowerShell имеет весь общий синтаксис, определенный, как указано выше, без каких-либо дополнений. [11]
- COMMAND.COM и cmd.exe имеют большую часть общего синтаксиса с некоторыми ограничениями.
[…]
а для COMMAND.COM*
может появиться только в конце шаблона. Он не может располагаться в середине шаблона, кроме как непосредственно перед точкой-разделителем расширения имени файла .
Программы Windows и DOS получают длинную строку командной строки вместо параметров в стиле argv, и они обязаны выполнять любое разделение, заключение в кавычки или расширение glob. Технически не существует фиксированного способа описания подстановочных знаков в программах, поскольку они могут делать все, что пожелают. Два распространенных расширителя глобусов включают в себя: [12]
- Расширитель командной строки Microsoft C Runtime (msvcrt), который поддерживает только
?
и*
. [13] И ReactOS (crt/misc/getargs.c), и Wine (msvcrt/data.c) содержат совместимую реализацию с открытым исходным кодом.__getmainargs
, функция, работающая под капотом, в основе ЭЛТ. - Cygwin MSYS и
dcrt0.cc
расширитель командной строки, использующий стиль unixglob()
рутина под капотом, после разделения аргументов.
Большинство других частей Windows, включая службу индексирования, используют подстановочные знаки в стиле MS-DOS, найденные в CMD. Этот синтаксис, являющийся пережитком эпохи имен файлов 8.3, уделяет особое внимание точкам в шаблоне и тексту (имени файла). Внутренне это делается с использованием трех дополнительных символов подстановки: <>"
. На стороне Windows API glob() эквивалент FindFirstFile и fnmatch() соответствует своему базовому RtlisNameInExpression . [14] (Другой аналог fnmatch — PathMatchSpec .) Оба расширителя msvcrt с открытым исходным кодом используют FindFirstFile , поэтому в них также будут применяться особенности имен файлов 8.3.
SQL
[ редактировать ]SQL LIKE
оператор имеет эквивалент ?
и *
но не […]
.
Общий подстановочный знак | Подстановочный знак SQL | Описание |
---|---|---|
?
|
_
|
соответствует любому отдельному символу |
*
|
%
|
соответствует любому количеству любых символов, включая ни одного |
Стандартный SQL использует синтаксис, подобный glob, для простого сопоставления строк. LIKE
оператор, хотя термин «glob» обычно не используется в сообществе SQL. Знак процента ( %
) соответствует нулю или более символам и знаку подчеркивания ( _
) соответствует ровно одному.
Многие реализации SQL расширили LIKE
оператор, позволяющий использовать более богатый язык сопоставления с образцом, включающий диапазоны символов ( […]
), их отрицание и элементы регулярных выражений. [15]
По сравнению с регулярными выражениями
[ редактировать ]Глобы не включают синтаксис звезды Клини , который допускает многократное повторение предыдущей части выражения; таким образом, они не считаются регулярными выражениями , которые могут описать полный набор регулярных языков в любом заданном конечном алфавите. [16]
Общий подстановочный знак | Эквивалентное регулярное выражение |
---|---|
?
|
.
|
*
|
.*
|
Глобы пытаются сопоставить всю строку (например, S*.DOC
соответствует S.DOC и SA.DOC, но не POST.DOC или SURREY.DOCKS), тогда как, в зависимости от деталей реализации, регулярные выражения могут соответствовать подстроке.
Реализация в виде регулярных выражений
[ редактировать ]Исходная реализация автоматической настройки прокси-сервера Mozilla , которая обеспечивает функцию глобального сопоставления строк, использует реализацию replace-as-RegExp, как указано выше. В таком примере синтаксис скобок покрывается регулярным выражением.
Python fnmatch использует более сложную процедуру для преобразования шаблона в регулярное выражение. [17]
Другие реализации
[ редактировать ]Помимо использования в оболочках, шаблоны globs также находят применение в различных языках программирования, в основном для обработки человеческого ввода. Интерфейс в стиле glob для возврата файлов или интерфейс в стиле fnmatch для сопоставления строк можно найти в следующих языках программирования:
- C# имеет несколько библиотек, доступных через NuGet, например
Glob
. [18] илиDotNet.Glob
. [19] - У Д есть
globMatch
функционировать вstd.path
модуль. [20] - В JavaScript есть библиотека под названием
minimatch
который используется внутри npm иmicromatch
, предположительно более оптимизированная, точная и безопасная реализация подстановки, используемая Babel и Yarn. [21] [22] - У Go есть
Glob
функционировать вfilepath
упаковка. [23] - В Java есть
Files
класс, содержащий методы, которые работают с шаблонами glob. [24] - В Хаскеле есть
Glob
пакет с основным модулемSystem.FilePath.Glob
. Синтаксис шаблонов основан на подмножестве Zsh . Он пытается оптимизировать заданный шаблон и должен работать заметно быстрее, чем наивное посимвольное сопоставление. [25] - В Perl есть оба
glob
(как описано в Ларри Уолла книге «Программирование на Perl ») и расширение Glob , которое имитирует процедуру glob BSD. [26] Угловые скобки Perl также можно использовать для подстановки:<*.log>
. - В PHP есть
glob
функция. [27] - У Python есть
glob
модуль в стандартной библиотеке, который выполняет сопоставление имен файлов с шаблоном подстановочных знаков, [28] иfnmatch
модуль с функциями для сопоставления строк или списков фильтрации на основе тех же шаблонов подстановочных знаков. [17] Гвидо ван Россум , автор языка программирования Python, написал и внес свой вклад вglob
рутина для BSD Unix в 1986 году. [29] Были предыдущие реализацииglob
, например, в программах ex и ftp в предыдущих выпусках BSD. - У Руби есть
glob
метод дляDir
класс, который выполняет сопоставление имен файлов с шаблоном подстановочных знаков. [30] Некоторые библиотеки, такие как Rant и Rake, предоставляютFileList
класс, который имеет метод glob или использует методFileList.[]
одинаково. - В Rust есть несколько библиотек, которые могут соответствовать шаблонам glob. [31]
- SQLite имеет
GLOB
функция. - Tcl содержит функцию подстановки. [32]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Раздел «Разное» руководства по Unix первого издания (PDF)» (PDF) . Архивировано из оригинала (PDF) 29 августа 2000 г. Проверено 11 мая 2011 г.
- ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Лаборатории Белла. 139.
- ^ Jump up to: а б Linux программиста Руководство – Библиотечные функции –
- ^ Linux программиста Руководство – Библиотечные функции –
- ^ https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching. Архивировано 15 марта 2018 г. в справочном руководстве Wayback Machine Bash.
- ^ Jump up to: а б «Базовые спецификации открытой группы, выпуск 7 IEEE Std 1003.1, издание 2013 г., 2.13. Нотация сопоставления с образцом» . Архивировано из оригинала 27 апреля 2014 г. Проверено 26 октября 2015 г.
- ^ Jump up to: а б «Руководство программиста Linux, GLOB(7)» . Архивировано из оригинала 31 октября 2015 г. Проверено 26 октября 2015 г.
- ^ «Расширенное руководство по написанию сценариев Bash, глава 19.2: Подстановка имен файлов» (Mendel Cooper, 2003) содержит краткий набор примеров шаблонов подстановки имен файлов.
- ^ «Баш-шарики» . База знаний Грега по bash . Архивировано из оригинала 18 ноября 2019 г. Проверено 25 ноября 2019 г.
- ^ Jump up to: а б «Сопоставление с образцом» . Справочное руководство по Bash . Архивировано из оригинала 11 февраля 2016 г. Проверено 11 января 2016 г.
- ^ «Поддержка подстановочных знаков в параметрах командлета» . Майкрософт . Сеть разработчиков Microsoft.
- ^ «Расширение подстановочных знаков» . Сеть разработчиков Microsoft. 2013. Архивировано из оригинала 22 августа 2014 г. Проверено 16 октября 2013 г.
- ^ «Расширение подстановочных знаков» . docs.microsoft.com . 08.02.2022.
- ^ Подстановочные знаки в Windows. Архивировано 24 декабря 2019 г. на Wayback Machine . Блог разработчиков MSDN.
- ^ «LIKE (Transact-SQL)» . 2023-05-23. Архивировано из оригинала 2 августа 2017 г. Проверено 1 августа 2017 г.
- ^ Хопкрофт, Джон Э.; Мотвани, Раджив; Уллман, Джеффри Д. (2000). Введение в теорию автоматов, языки и вычисления (2-е изд.). Аддисон-Уэсли.
- ^ Jump up to: а б "Lib/fnmatch.py" . Питон. 20 января 2021 г. Архивировано из оригинала 10 ноября 2021 г. Проверено 10 ноября 2021 г.
- ^ "ктомпсон/глоб" . Гитхаб . Архивировано из оригинала 26 октября 2020 г. Проверено 6 ноября 2020 г.
- ^ "дазинатор/dotnet.glob" . Гитхаб . Архивировано из оригинала 22 июня 2022 г. Проверено 22 июня 2022 г.
- ^ «std.path — Язык программирования D — Digital Mars» . dlang.org. Архивировано из оригинала 8 сентября 2014 г. Проверено 8 сентября 2014 г.
- ^ "исаакс/миниматч" . Гитхаб . Архивировано из оригинала 28 июля 2016 г. Проверено 10 августа 2016 г.
- ^ «йоншлинкерт/микроматч» . Гитхаб . Архивировано из оригинала 11 февраля 2016 г. Проверено 4 апреля 2017 г.
- ^ «Путь к файлу пакета — язык программирования Go» . Голанг.орг. Архивировано из оригинала 25 мая 2011 г. Проверено 11 мая 2011 г.
- ^ «Операции с файлами» . Оракул. Архивировано из оригинала 20 сентября 2013 г. Проверено 16 декабря 2013 г.
- ^ «Glob-0.7.4: Библиотека подстановки» . Архивировано из оригинала 8 мая 2014 г. Проверено 7 мая 2014 г.
- ^ «File::Glob — расширение Perl для подпрограммы BSD glob» . perldoc.perl.org . Проверено 11 мая 2011 г.
- ^ "glob - Руководство" . PHP. 06 мая 2011 г. Архивировано из оригинала 13 ноября 2017 г. Проверено 11 мая 2011 г.
- ^ «10.7. glob — расширение шаблона пути в стиле Unix — документация Python v2.7.1» . Документы.python.org. Архивировано из оригинала 16 мая 2011 г. Проверено 11 мая 2011 г.
- ^ « Библиотечная процедура «подстановки»» . Архивировано из оригинала 19 декабря 2007 г. Проверено 11 мая 2011 г.
- ^ «Класс: Режиссёр» . Ruby-doc.org. Архивировано из оригинала 15 мая 2011 г. Проверено 11 мая 2011 г.
- ^ "#glob - Lib.rs" . lib.rs. Архивировано из оригинала 12 ноября 2021 г. Проверено 12 ноября 2021 г.
- ^ «Страница руководства TCL glob» . Архивировано из оригинала 8 декабря 2011 г. Проверено 16 ноября 2011 г.