Python regex эквивалент kwrite [] + и [0-9] +

Короткий ответ заключается в том, что вы можете не использовать регулярные выражения для поиска в истории оболочки. Согласно POSIX (стандарт для Unix-подобных операционных систем), вы должны иметь возможность выполнять поиск с использованием обычного сопоставления с шаблоном оболочки (как используется для подстановки имен файлов и с case заявления). Эта функция называется неинкрементным поиском , но в настоящее время она, похоже, неправильно реализована в Bash.

Спецификация POSIX

Спецификация POSIX для оболочки Редактирование командной строки (режим vi) утверждает, что эти шаблоны поиска должны использовать обычное сопоставление с шаблоном оболочки. Хотя метасимвол ^ используется для сопоставления начала строки, это не регулярные выражения.

/ pattern

Перемещение назад по истории команд, поиск указанного шаблона , начиная с предыдущей командной строки. Шаблоны используют нотацию сопоставления с образцом , описанную в Нотация сопоставления с образцом , за исключением того, что символ '^' имеет особое значение, когда появляется {{1 }} как первый символ шаблона . В этом случае '^' отбрасывается, и символы после '^' должны совпадать только в начале строки . Команды в истории команд должны рассматриваться как строки, а не как имена файлов .

Документированная реализация Bash

Bash использует библиотеку GNU Readline для обеспечения своих возможностей интерактивного редактирования строк и поиска в истории.В официальной документации библиотеки Readline больше внимания уделяется режиму Emacs, но в небольшом разделе в ее руководстве Режим Readline vi говорится, что

Хотя библиотека Readline не имеет полного набора функций редактирования vi, в нем достаточно, чтобы можно было просто редактировать строку.

Режим Readline vi работает в соответствии со стандартом POSIX.

Фактическая реализация Bash

После ряда экспериментов на двух разных системах я обнаружил, что неинкрементный поиск в Bash / Readline не работает так, как описано в его официальной документации. Я обнаружил, что * обрабатывается как буквальная звездочка, а не как шаблон, который соответствует нескольким символам. Аналогично, ? и [ также обрабатываются как буквальные символы.

Для сравнения я попытался использовать режим Vi в tcsh и убедился, что он правильно реализует поиск в истории, как указано в стандарте POSIX.

Затем я загрузил и просмотрел код библиотеки Readline и обнаружил, что ее функции поиска в истории используют простой поиск по подстроке и не используют никаких метасимволов поискового шаблона - кроме каретки, ^ (см. search.c из репозитория git для библиотеки Readline).

Я полагаю, что разработчики Bash / Readline еще не реализовали эту функцию. Я не смог найти список ошибок, но файлы CHANGES показывают, что они регулярно исправляли проблемы, связанные с режимом Vi.

0
28.01.2012, 16:12
0 ответов

Теги

Похожие вопросы