Вопрос или проблема
Где я могу найти справочник по шаблонам поиска регулярных выражений для less
?
Я хочу искать в файле с помощью less
используя \d
для поиска цифр, но похоже, что он не понимает этот шаблон. Я пытался найти справочник по регулярным выражениям для less
, но не смог ничего найти ни в man-страницах, ни в Интернете.
Man-страница less
гласит:
/pattern
Искать вперед в файле N-ю строку, содержащую
шаблон. N по умолчанию равен 1. Шаблон — это регулярное
выражение, как его распознает библиотека регулярных выражений,
поставляемая вашей системой.
Таким образом, допустимый синтаксис может зависеть от вашей системы. На моем Debian система принимает расширенные регулярные выражения, см. regex(7)
, и Почему мое регулярное выражение работает в X, но не в Y?
\d
происходит от Perl и не поддерживается всеми механизмами регулярных выражений. Используйте [0-9]
или [[:digit:]]
, чтобы сопоставить цифры. (Их точное поведение может зависеть от локали.)
Выражения, поддерживаемые less
, документированы в мануале re_format(7)
(man 7 re_format
). Этот мануал описывает как расширенные регулярные выражения, так и базовые регулярные выражения, доступные в вашей системе. Утилита less
понимает расширенные регулярные выражения.
Чтобы сопоставить цифру, вы можете использовать [0-9]
или [[:digit:]]
(есть небольшая разница, поскольку первое зависит от текущей локали). Шаблон \d
является регулярным выражением, подобным Perl (PCRE), не поддерживается less
.
Если вы выполните ./configure --help
из исходного дистрибутива текущих версий less
, вы увидите:
[...]
Optional Packages:
[...]
--with-regex=LIB выбрать библиотеку регулярных выражений (LIB: один из auto,none,gnu,
pcre,pcre2,posix,regcmp,re_comp,regcomp,regcomp-local) [auto]
[...]
С использованием по умолчанию auto
, что означает использование первой доступной в системе в этом порядке:
- posix, то есть стандартные API
regcomp()
/regexec()
, вызванные сREG_EXTENDED
, где доступно. - pcre2 как замена сейчас устаревшей
- pcre (совместимое с perl регулярное выражение)
- gnu, с использованием
re_compile_pattern()
/re_search()
API (сre_set_syntax(RE_SYNTAX_POSIX_EXTENDED)
) - regcmp (старый устаревший API из PWB Unix, но все еще найденный на некоторых коммерческих Unix-системах на основе SysV)
- regcomp, не POSIX regcomp, а более старый API из исследовательского Unix V8 начала 80-х годов.
- regcomp-local, то же, что и выше, но как в комплекте с
regexp.c
поставляемом сless
. - re_comp, функции
re_comp()
иre_exec() code>, из 4.0BSD все еще найденные в современных BSD.
Какой вкус регулярных выражений поставляется, будет зависеть от выбранного выше API и от системы и реализации API.
На большинстве систем, если не указано иное при сборке с помощью --with-regex
, API, скорее всего, будет POSIX с его regcomp()
/regexec() code> функциями, поскольку это первое в этом списке выше, и оно должно быть доступно на всех современных системах.
regcomp()
вызывается с флагом REG_EXTENDED
, если он поддерживается библиотекой регулярных выражений, что означало бы использование POSIX расширенные регулярные выражения реализованы на системе.
Это означает, что у вас должны быть по крайней мере операторы расширенных регулярных выражений, указанные в какой-то версии POSIX стандард (по крайней мере ^$.\()|{}*+?
и выражения в скобках, которые были там с первой редакции POSIX.2 в 1992 году), и они должны работать, как указано, хотя следует отметить, что некоторые из сложных зависящих от локали вещей в выражениях в скобках, таких как [[:class:]]
, [[=character-equivalence=]]
и [[.collating-element.]]
не всегда реализуются, особенно в встроенных системах.
Некоторые реализации будут поддерживать расширения сверх того, что специфицируется POSIX, включая некоторые заимствованные из perl, такие как \s
, \w
, *?
, или из ex
, такие как \<
, \>
, изучение документации функции regcomp()
вашей системы должно дать вам подсказки относительно того, где найти документацию по расширенному синтаксису регулярных выражений вашей системы.
Остерегайтесь некоторых, как \<
, \>
(или его BSD эквивалентов [[:<:]]
/[[:>:]]
или perl эквивалент \b
для границы слова) не работают хорошо с POSIX API. Например, echo ababcab | less +/'\<ab'
на системах, где \<
поддерживается, выделит первые два ab
¹.
В зависимости от API регулярных выражений, ввод может декодироваться или не декодироваться как текст в соответствии с charmap локали или может поддерживать только одно-байтовые наборы символов или только UTF-8 как многобайтовый charmap, так что .
например, может не соответствовать многобайтовому символу, но каждому байту его кодирования.
/
и ?
оператор поиска в less
также может обрабатывать первый(е) символ(ы), который(е) вы вводите после этого, особым образом, как указано в его мануале, включая:
^R
Не интерпретировать метасимволы регулярных выражений; то есть, выполнить простое текстовое сравнение.
Но и печатные символы, такие как @
или !
, которые нужно экранировать с помощью \
для их указания в буквальном смысле в движку регулярных выражений.
Чтобы найти десятичную цифру ASCII
[0123456789]
должно работать с любыми API и вкусами регулярных выражений,\d
будет работать с pcre/pcre2 ((*UTF)(*UCP)\d
или(*UTF)\p{Nd}
² также будет соответствовать всем UTF-8 закодированным символам, классифицируемым как десятичная цифра в Unicode) включая внутри выражений в скобках, и может также работать в некоторых других (хотя, как правило, не внутри выражений в скобках). Спецификация расширенных регулярных выражений POSIX оставляет\d
неуточненным, пока он находится вне выражений в скобках, позволяя реализациям придавать ему особое значение на свое усмотрение.[[:digit:]]
будет работать в нескольких, но в зависимости от локали и/или системы может соответствовать некоторым другим десятичным цифрам, кроме английских ASCII[0-9]
должно соответствовать всем 0123456789, но может также совпадать с другими символами, которые совпадают с диапазоном от 0 до 9 в локали, включая некоторые, которые обычно не классифицируются как десятичные цифры, такие как🆛
.
¹ Использование API GNU или PCRE(2) обычно позволяет избежать таких проблем, но, к сожалению, способ вызова их в less, когда они используются демонстрирует проблему так же, как когда выполняется повторный поиск, он передает им только текст после последнего совпадения, как это делается (и должно быть сделано) с использованием POSIX API вместо передачи одного и того же ввода, но указывая им, где начать поиск. Эта проблема также затрагивает операторы обратного поиска PCRE.
² Это (*UTF)
для того, чтобы ввод интерпретировался как закодированный UTF-8, необходимо только для PCRE2 в локалях UTF-8, но не для PCRE. В явном коде на это предусмотрено для PCRE. Его отсутствие для PCRE2 выглядит, как ошибка по моему мнению.
Ответ или решение
Вопрос, который касается поиска с использованием утилиты less
и регулярных выражений, заслуживает тщательного рассмотрения, поскольку он поднимает аспекты, связанные с выбором правильных инструментов и пониманием поддерживаемых синтаксисов на различных системах. Регулярные выражения являются мощным инструментом для поиска и манипуляции текстом, но специфика их реализации может существенно различаться в зависимости от используемой библиотеки.
Теория:
Команда less
является популярным инструментом для просмотра содержимого текстовых файлов в командной строке, и она поддерживает поиск с использованием регулярных выражений (регэкспов), что делает ее удобной для сложных текстовых анализов. Однако не все возможные в других инструментах синтаксисы регулярных выражений могут поддерживаться в less
. В частности, использование \d
для поиска цифр, знакомое по Perl-совместимым регулярным выражениям (PCRE), не обязательно поддерживается в less
. Вместо этого, для поиска цифр стоит использовать конструкции [0-9]
или [[:digit:]]
.
less
использует библиотеку регулярных выражений, поставляемую с операционной системой, что отражено в мэн-страницах утилиты. На большинстве систем эта библиотека соответствует стандарту POSIX, что обеспечивает поддержку расширенных регулярных выражений (ERE). Это значит, что less
, как правило, поддерживает базовые символы регулярных выражений, такие как ^
(начало строки), $
(конец строки), .
(любой символ), а также такие конструкции, как ()
для группировки и |
для альтернатив.
Пример:
Если вы используете систему на базе Debian, например, то less
на этой системе будет поддерживать расширенные регулярные выражения, поскольку система по умолчанию использует POSIX-совместимые библиотеки. Однако, максимальная степень совместимости с Perl-совместимыми регулярными выражениями будет отсутствовать. Поэтому, попытка использовать \d
для поиска одной или нескольких цифр приведет к ошибке или нежелательному результату, если ваш системный компилятор регэкспов не поддерживает \d
как соответствие для цифр.
Для поиска всех числовых строк в файле вы можете использовать следующее выражение:
[0-9]+
, которое найдет последовательности из одной или более цифр.[[:digit:]]+
, которое сработает аналогично, но с учетом локализации может охватывать и другие числовые символы, отличные от стандартных десятичных цифр.
Например, если у вас есть файл example.txt
и вы хотите найти все строки, содержащие числовые значения, вы можете запустить less example.txt
и затем использовать команду поиска /[0-9]+
, чтобы выделить все такие строки.
Применение:
Знание специфики регулярных выражений, поддерживаемых less
, критически важно при выполнении сложного поиска в больших текстовых файлах. Это может быть полезно не только в повседневной работе с текстовыми файлами, но и при выполнении логов, анализа данных и других задач, требующих эффективного текстового парсинга.
Когда вы сталкиваетесь с проблемой неподдерживаемого синтаксиса регулярного выражения, важно свериться с документацией less
, чтобы понять, какие конструкты доступны. Также имеет смысл проверить сборочные опции less
, от которых зависит выбор библиотеки регулярных выражений. Эти опции задаются при компиляции через флаг --with-regex
, который позволяет выбрать нужный движок регулярных выражений, например, POSIX или PCRE2, если он уже установлен в системе.
Правильный подход к настройке и использованию регулярных выражений может значительно повысить вашу продуктивность, позволив быстро находить и анализировать нужные данные. При этом знание альтернативных методов и регулярных выражений поможет вам в случае, если вы работаете на разных системах или с разными версиями утилиты.
Таким образом, при работе с утилитой less
важно учитывать ограничения и особенности регулярных выражений, а также оставаться гибким и использовать альтернативные подходы для достижения желаемого результата в текстовом поиске и анализе.