Intereting Posts
Регулярное выражение, соответствующее X-идентификаторам сеанса? «Make» не находит установленную библиотеку unixODBC и iODBC одновременно установлены? Копировать файл при замене текста в нем Bash работает с несколькими программами и закрывается Сценарий Python работает с терминалом, но не работает в планировщике, для записи на внешний диск Насколько похожи / отличаются два бинарных файла Каким компаниям разрешено производить и продавать продукты Unix? mkfsdos: определить размер файловой системы FAT16 | 32 на USB-накопителе в Linux У вас есть окно, отображаемое на обоих экранах в настройке с двумя мониторами Что регулирует пределы расширения скобки оболочки? Как установить метаданные для музыкальных файлов? Удаление и преобразование зоны Solaris OOM от итерации по очень большой карте памяти Правильное расположение программного обеспечения в разделе без загрузки

Регулярные выражения в оболочке

У меня есть два вопроса об использовании регулярных выражений внутри оболочки.

1. Использование *

Согласно странице wikipedia о регулярных выражениях :

*: Звездочка указывает, что существует ноль или более предыдущего элемента. Например, ab * c соответствует «ac», «abc», «abbc», «abbbc» и т. Д.

Однако, когда я пишу rm test*.iso , он удалит все файлы, начинающиеся с «test» и заканчивая «.iso» независимо от того, что есть (или нет) между «test» и «.iso». Таким образом, файл tes.iso не будет удален.

Если вы возьмете пример abc, согласно wikipedia, «ab * c» соответствует «ac». Поэтому rm ab*c должен удалить файл «ac». Почему rm не использует регулярное выражение, как описывает их wikipedia?

2. Использование – и?

Все же согласно странице wikipedia на регулярных выражениях :

?: Вопросительный знак указывает, что есть нуль или один из предыдущего элемента. Например, colou? R соответствует как «цвет», так и «цвет».

+: Знак «плюс» указывает, что есть один или несколько предыдущих элементов. Например, ab + c соответствует «abc», «abbc», «abbbc» и т. Д., Но не «ac».

"?" похоже, работает как «*», то есть «?» символ заменяет один или нулевой элемент (но не предыдущий, наоборот, как говорит википедия).

Я не знаю, как использовать «+», и это мой второй вопрос. Меня также интересуют любые трюки, касающиеся регулярных выражений, и rm, cp, ...

Обозначение соответствия шаблона оболочки описано в этом стандартном документе .

Как отмечается в документе во введении, нотация соответствия шаблонов связана, но немного отличается от обозначений регулярных выражений.

В частности ? в оболочке действует как . в регулярном выражении, а * в оболочке действует как .* в регулярном выражении. (Но ни один из них не будет соответствовать . В начале имени файла.) + В оболочке нет специальной возможности сопоставления шаблонов. Однако, как говорит @HaukeLaging в своем ответе, некоторые оболочки могут опционально включать опознавание регулярных выражений, хотя это нестандартно.

Оболочка использует регулярные выражения только при определенных условиях (которые, вероятно, отличаются от оболочки к оболочке).

В bash вы должны активировать их с помощью: shopt -s extglob

После этого вы можете использовать что-то вроде:

 echo a*(b)c 

См. Блок Pattern Matching в man bash .