stringtranslate.com

глоб (программирование)

В программировании шаблоны glob ( / ɡ l ɒ b / ) определяют наборы имен файлов с подстановочными знаками . Например, команда оболочки Unix Bash перемещает все файлы с именами, заканчивающимися на , из текущего каталога в каталог . Здесь — подстановочный знак, а — шаблон glob. Подстановочный знак означает «любую строку любой длины, включая пустую, но исключая символы-разделители пути ( в Unix и Windows)».mv *.txt textfiles/.txttextfiles**.txt*/\

Другим распространенным подстановочным знаком является вопросительный знак ( ?), который обозначает один символ. Например, переместит все файлы, имена которых содержат один символ, за которым следует , из текущего каталога в каталог , в то время как будет соответствовать всем файлам, имена которых состоят из 2 символов, за которыми следует .mv ?.txt shorttextfiles/.txtshorttextfiles??.txt.txt

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

Источник

Скриншот оригинальной справочной страницы Unix 1971 года для glob– владелец – dmr, сокращенно от Деннис Ритчи .

Команда glob, сокращение от global , появилась в самых ранних версиях Bell Labs' Unix . [1] Командные интерпретаторы ранних версий Unix (с 1-го по 6-е издание, 1969–1975) полагались на отдельную программу для расширения подстановочных знаков в аргументах без кавычек команды: /etc/glob . Эта программа выполняла расширение и предоставляла команде расширенный список путей к файлам для выполнения.

Glob изначально был написан на языке программирования B. Это была первая часть основного программного обеспечения Unix, разработанная на языке программирования высокого уровня . [2] Позже эта функциональность была предоставлена ​​как функция библиотеки C , glob(), используемая такими программами, как shell . Обычно она определяется на основе функции с именем fnmatch(), которая проверяет, соответствует ли строка заданному шаблону — программа, использующая эту функцию, затем может перебирать ряд строк (обычно имен файлов), чтобы определить, какие из них соответствуют. Обе функции являются частью POSIX : функции, определенные в POSIX.1 с 2001 года, и синтаксис, определенный в POSIX.2. [3] [4] Идея определения отдельной функции сопоставления началась с wildmat (сопоставление с подстановочными знаками), простой библиотеки для сопоставления строк с подстановочными знаками Bourne Shell.

Традиционно globs не соответствуют скрытым файлам в форме точечных файлов Unix ; чтобы соответствовать им, шаблон должен явно начинаться с .. Например, *соответствует всем видимым файлам, а .*соответствует всем скрытым файлам.

Синтаксис

Наиболее распространенными подстановочными знаками являются *, ?, и […].

Обычно символ-разделитель пути ( /в Linux/Unix, MacOS и т. д. или \в Windows) никогда не будет сопоставлен. Некоторые оболочки, такие как Bash, имеют функциональность, позволяющую пользователям обойти это. [5]

Unix-подобный

В Unix-подобных системах определяется так же, как указано выше, но *имеет два дополнительных значения: [6] [7]?[…]

Диапазоны также могут включать предопределенные классы символов, классы эквивалентности для акцентированных символов и символы сортировки для труднопечатаемых символов. Они определены для соответствия скобкам в регулярных выражениях POSIX. [6] [7]

Подстановка Unix обрабатывается оболочкой в ​​соответствии с традицией POSIX. Подстановка предоставляется для имен файлов в командной строке и в скриптах оболочки . [8] Предписанный POSIX caseоператор в оболочках обеспечивает сопоставление с шаблоном с использованием шаблонов подстановки.

Некоторые оболочки (например, оболочка C и Bash ) поддерживают дополнительный синтаксис, известный как чередование или расширение фигурных скобок . Поскольку он не является частью синтаксиса glob, он не предоставляется в case. Он раскрывается только в командной строке перед glob.

Оболочка Bash также поддерживает следующие расширения: [9]

Windows и DOS

Команда dirс шаблоном glob в IBM PC DOS 1.0.

Оригинальный DOS был клоном CP/M, разработанным для работы на процессорах Intel 8088 и 8086. Оболочки Windows, следуя DOS, традиционно не выполняют никаких расширений glob в аргументах, передаваемых внешним программам. Оболочки могут использовать расширение для своих собственных встроенных команд:

Программы Windows и DOS получают длинную строку командной строки вместо параметров в стиле argv, и они несут ответственность за выполнение любого разделения, кавычек или расширения glob. Технически нет фиксированного способа описания подстановочных знаков в программах, поскольку они вольны делать то, что хотят. Два распространенных расширителя glob включают: [12]

Большинство других частей Windows, включая службу индексирования, используют стиль MS-DOS подстановочных знаков, найденных в CMD. Этот синтаксис, являющийся пережитком эпохи имен файлов 8.3, уделяет особое внимание точкам в шаблоне и тексту (имени файла). Внутри это делается с помощью трех дополнительных подстановочных знаков, <>". На стороне API Windows эквивалентом glob() является FindFirstFile , а fnmatch() соответствует его базовому RtlIsNameInExpression . [14] (Другой аналог fnmatch — PathMatchSpec .) Оба расширителя msvcrt с открытым исходным кодом используют FindFirstFile , поэтому особенности имен файлов 8.3 также будут применяться в них.

SQL

Оператор SQL LIKE имеет эквивалент ?and, *но не […].

Стандартный SQL использует синтаксис типа glob для простого сопоставления строк в своем LIKEоператоре, хотя термин «glob» обычно не используется в сообществе SQL. Знак процента ( %) соответствует нулю или более символов, а подчеркивание ( _) соответствует ровно одному.

Многие реализации SQL расширили LIKEоператор, чтобы обеспечить более богатый язык сопоставления с шаблонами, включая диапазоны символов ( […]), их отрицание и элементы регулярных выражений. [15]

По сравнению с регулярными выражениями

Глобы не включают синтаксис для звезды Клини , которая допускает многократное повторение предыдущей части выражения; таким образом, они не считаются регулярными выражениями , которые могут описывать полный набор регулярных языков по любому заданному конечному алфавиту. [16]

Глобы пытаются сопоставить всю строку (например, S*.DOCсопоставляют S.DOC и SA.DOC, но не POST.DOC или SURREY.DOCKS), тогда как, в зависимости от деталей реализации, регулярные выражения могут сопоставлять подстроку.

Реализация в виде регулярных выражений

Оригинальная реализация автоконфигурации прокси Mozilla , которая обеспечивает функцию соответствия глобуса строкам, использует реализацию replace-as-RegExp, как указано выше. Синтаксис скобок в таком примере оказывается покрытым регулярным выражением.

Функция fnmatch в Python использует более сложную процедуру для преобразования шаблона в регулярное выражение. [17]

Другие реализации

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

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

Ссылки

  1. ^ "First Edition Unix manual 'Miscellaneous' section (PDF)" (PDF) . Архивировано из оригинала (PDF) 2000-08-29 . Получено 2011-05-11 .
  2. ^ Макилрой, МД (1987). Исследовательский ридер Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Bell Labs. 139.
  3. ^ ab fnmatch(3) –  Руководство программиста Linux – Библиотечные функции
  4. ^ glob(3)  –  Руководство программиста Linux – Библиотечные функции
  5. ^ https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching Архивировано 15.03.2018 в справочном руководстве Wayback Machine Bash
  6. ^ ab "The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. Pattern Matching Notation". Архивировано из оригинала 2014-04-27 . Получено 2015-10-26 .
  7. ^ ab "Linux Programmer's Manual, GLOB(7)". Архивировано из оригинала 2015-10-31 . Получено 2015-10-26 .
  8. ^ В «Advanced Bash-Scripting Guide, Глава 19.2: Подстановка» (Мендель Купер, 2003) содержится краткий набор примеров шаблонов подстановки имен файлов.
  9. ^ "Bash globs". База знаний bash Грега . Архивировано из оригинала 18.11.2019 . Получено 25.11.2019 .
  10. ^ ab "Pattern Matching". Справочное руководство Bash . Архивировано из оригинала 2016-02-11 . Получено 2016-01-11 .
  11. ^ «Поддержка подстановочных знаков в параметрах командлета». Microsoft . Microsoft Developer Network. 2023-12-18.
  12. ^ "Wildcard Expansion". Microsoft Developer Network. 2013. Архивировано из оригинала 2014-08-22 . Получено 2013-10-16 .
  13. ^ "Расширение подстановочных знаков". docs.microsoft.com . 2022-02-08.
  14. ^ Подстановочные знаки в Windows. Архивировано 24 декабря 2019 г. на Wayback Machine . MSDN Devblog.
  15. ^ "LIKE (Transact-SQL)". 2023-05-23. Архивировано из оригинала 2017-08-02 . Получено 2017-08-01 .
  16. ^ Хопкрофт, Джон Э.; Мотвани, Раджив; Ульман, Джеффри Д. (2000). Введение в теорию автоматов, языки и вычисления (2-е изд.). Эддисон-Уэсли.
  17. ^ ab "Lib/fnmatch.py". Python. 2021-01-20. Архивировано из оригинала 2021-11-10 . Получено 2021-11-10 .
  18. ^ "kthompson/glob". GitHub . Архивировано из оригинала 2020-10-26 . Получено 2020-11-06 .
  19. ^ "dazinator/dotnet.glob". GitHub . Архивировано из оригинала 2022-06-22 . Получено 2022-06-22 .
  20. ^ "std.path - Язык программирования D - Цифровой Марс". dlang.org. Архивировано из оригинала 2014-09-08 . Получено 2014-09-08 .
  21. ^ "isaacs/minimatch". GitHub . Архивировано из оригинала 2016-07-28 . Получено 2016-08-10 .
  22. ^ "jonschlinkert/micromatch". GitHub . Архивировано из оригинала 2016-02-11 . Получено 2017-04-04 .
  23. ^ "Package filepath - The Go Programming Language". Golang.org. Архивировано из оригинала 2011-05-25 . Получено 2011-05-11 .
  24. ^ "File Operations". Oracle. Архивировано из оригинала 2013-09-20 . Получено 16.12.2013 .
  25. ^ "Glob-0.7.4: библиотека подстановки". Архивировано из оригинала 2014-05-08 . Получено 2014-05-07 .
  26. ^ "File::Glob - расширение Perl для процедуры BSD glob". perldoc.perl.org . Получено 2011-05-11 .
  27. ^ "glob - Manual". PHP. 2011-05-06. Архивировано из оригинала 2017-11-13 . Получено 2011-05-11 .
  28. ^ "10.7. glob — Расширение шаблона пути в стиле Unix — Документация Python v2.7.1". Docs.python.org. Архивировано из оригинала 2011-05-16 . Получено 2011-05-11 .
  29. ^ "Процедура библиотеки 'Globbing'". Архивировано из оригинала 2007-12-19 . Получено 2011-05-11 .
  30. ^ "Class: Dir". Ruby-doc.org. Архивировано из оригинала 2011-05-15 . Получено 2011-05-11 .
  31. ^ "#glob - Lib.rs". lib.rs . Архивировано из оригинала 2021-11-12 . Получено 2021-11-12 .
  32. ^ "TCL glob manual page". Архивировано из оригинала 2011-12-08 . Получено 2011-11-16 .