Регулярные выражения в оболочке
У меня есть два вопроса об использовании регулярных выражений внутри оболочки.
1. Использование *
Согласно странице wikipedia о регулярных выражениях :
- Что означает это регулярное выражение? <! -. * ->
- Захват в переменных оболочки аргументов после команды (между скобками)
- sed, конвертировать одиночную обратную косую черту в двойную обратную косую черту
- sed, grep или tr, которая возвращает только латинские символы из файла UTF-8
- регулярное выражение для извлечения информации в сценарии оболочки
*: Звездочка указывает, что существует ноль или более предыдущего элемента. Например, 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, ...
2 Solutions collect form web for “Регулярные выражения в оболочке”
Обозначение соответствия шаблона оболочки описано в этом стандартном документе .
Как отмечается в документе во введении, нотация соответствия шаблонов связана, но немного отличается от обозначений регулярных выражений.
В частности ?
в оболочке действует как .
в регулярном выражении, а *
в оболочке действует как .*
в регулярном выражении. (Но ни один из них не будет соответствовать .
В начале имени файла.) +
В оболочке нет специальной возможности сопоставления шаблонов. Однако, как говорит @HaukeLaging в своем ответе, некоторые оболочки могут опционально включать опознавание регулярных выражений, хотя это нестандартно.
Оболочка использует регулярные выражения только при определенных условиях (которые, вероятно, отличаются от оболочки к оболочке).
В bash
вы должны активировать их с помощью: shopt -s extglob
После этого вы можете использовать что-то вроде:
echo a*(b)c
См. Блок Pattern Matching
в man bash
.