Сопоставление с шаблоном или wildcarding в bash

Bash поддерживает сопоставление с шаблоном, которое иногда называют подстановкой знаков (wildcarding).
Шаблоны - это не RegEx

Примеры

[0-9] - любая ЦИФРА
[0-9]* - любые ЦИФРЫ
[!0-9] или[^0-9] - ВСЕ, кроме цифр
[aeiou] - любая ГЛАСНАЯ буква
[^aeiou] или [^aeiou] - всё, кроме гласных

Классы символов

Класс символовОписание
[[:alnum:]]Алфавитно-цифровой
[[:alpha:]]Буквенный
[[:ascii:]]ASCII
[[:blank:]]Пробел или табуляция
[[:ctrl:]]Управляющий символ
[[:digit:]]Число
[[:graph:]]Все что угодно кроме управляющих символов и пробела
[[:lower:]]Символы в нижнем регистре
[[:upper:]]Символы в верхнем регистре
[[:print:]]Все, кроме управляющих символов
[[:punct:]]Символы пунктуации
[[:space:]]Пробелы, включая разрывы строк
[[:word:]]Буквы, цифры и символ подчеркивания
[[:xdigit:]]Шестнадцатеричный символ

Примеры

Классы символов указываются как [:ctrl:], но в дополнительных скобках, поэтому в итоге получается [[:ctrl:]].

Например:

*[[:punct:]]jpg - любое имя файла ('wow!jpg', 'some,jpg', 'photo.jpg')

Пример с grep:

grep 'X[[:upper:][:digit:]]' idlist.txt

Выведется любая строка, содержащая символ X, за которым идет любая прописная буква или цифра:

User: XTjohnson
an XWing model 7
an X7wing model

Более сложные виды сопоставления можно “включить”, если добавитьь параметр extglob оболочки, чтобы можно было повторять или отменять шаблоны:

shopt -s extglob

Weird shi

Если при указании, например, на:

echo data > /tmp/*.out

в tmp/ не будет файла, заканчивающегося на .out, то оболочка создаст там файл с именем *.out - удалять его можно так:

rm /tmp/\*.out

Внутри кавычек wildcaring НЕ работает

Внутри кавычек (двойных/одинарных) не работает сопоставление с шаблоном.
Поэтому команда:

echo data > "/tmp/*.out"

создаст файл с именем /tmp/*.out.
Поэтому НЕ юзай кавычки при сопоставлении с шаблоном.


Соус: Книга “Bash и кибербезопасность Глава 2. “Основы работы с bashШаблон соответствия в bash

bash