У меня два вопроса по использованию регулярных выражений внутри оболочки.
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
.