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

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

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, ...

2 Solutions collect form web for “Регулярные выражения в оболочке”

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

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

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

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

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

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

 echo a*(b)c 

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

  • Все вхождения регулярного выражения удаляются без использования «глобального» модификатора
  • Регулярное выражение ERE для разделения () между разделителем и конечным словом
  • Sed: изменить каждое повторение не первого слова для каждого слова в тексте
  • Как выразить все файлы / каталоги в опции extra -exec команды `find`?
  • Почему sed не использует расширенный режим регулярного выражения по умолчанию?
  • Создание шаблона регулярного выражения для grep
  • regex хотел исключить строку
  • RegEx в bash для извлечения строки после первого разделителя
  • Интерактивный поиск с помощью подстановочных знаков
  • regexp в поиске только для поиска
  • Заменить все вхождения шаблона с помощью первой согласованной группы
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.