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

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

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

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

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

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

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

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

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

Тем не менее, согласностраница википедии о регулярных выражениях:

?: Вопросительный знак указывает на отсутствие или отсутствие одного из предшествующих элементов. Например, colou?r соответствует как "color", так и "color".

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

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

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

решение1

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

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

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

решение2

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

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

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

echo a*(b)c

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

Связанный контент