Яндекс.Практикум

Маска символов (регулярные выражения) – простая (но важная) вещь, которую нужно знать о Linux

Оригинальный текст: 14 Wildcards Simple (But Important) Things To Remember Linux Scripting

Перевод: очень вольный, собственный

Оболочки командной строки Linux поддерживают различные регулярные выражения, которые можно использовать для манипуляций с именами файлов для группировки их по заданному шаблону. К примеру, необходимо удалить 100 файлов в текущей папке, имеющих расширение .txt. Можно попробовать обработать их поодиночке. Однако, если с 10 файлами проделать это будет просто нудно, то с 100 – еще и займёт слишком много времени. Гораздо лучшее решение – использовать для подобных целей маски символов или регулярных выражений.

В данном случае нужно удалить файлы, имена которых заканчивается на .txt. При этом не важно, из каких цифр или букв состоит остальная часть файла. В данном случае маска символов – именно эта часть “не важно”. В имени файла оно может принимать любое значение.

Что такое маска символов или регулярное выражение в Linux?

Маска – это шаблон, эквивалентный по своему значению одному или сразу нескольким символам.

14 примеров использования регулярных выражений в именах файлов

1. Один любой символ (?)

С помощью команды ls (просмотр содержимого папки) продемонстрируем, как знак вопроса заменяет собой один любой символ
ozi@blog:~$ ls -l ?? -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 bs -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 lq -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 tz
ozi@blog:~$ ls -l a? -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar
В данном примере было показано, что знак ‘?’ эквивалентен одному любому символу

2. Любая строка (*)

Заменяет собой 0 и больше любых символов
ozi@blog:~$ ls -l *.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt
ozi@blog:~$ ls -l *????.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt

3. Один символ из определённого подмножества ([множество])

С помощью квадратных скобок можно определить нужное нам подмножество символов
ozi@blog:~$ ls -l [1aB]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt
ozi@blog:~$ ls -l ?[125]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt

4. Символ, который не входит в определённое множество ([!множество])

Подставив перед подмножеством восклицательный знак, можно исключить эти символы
ozi@blog:~$ ls -l [!1aB]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt
ozi@blog:~$ ls -l ?[!125]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt
Примечание: во многих языках программирования ‘!’ обозначает отрицание или, по-простому, “не”.

5. Только буквы ([[:alpha]])

Если нужно заменить только буквенные символы, то можно использовать специальную маску [:alpha:] ozi@blog:~$ ls -l [[:alpha:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt

6. Все символы, не обозначающие буквы ([![:alpha:]])

Знак ‘!’ применим и к специальным маскам
ozi@blog:~$ ls -l [![:alpha:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt

7. Символы нижнего регистра ([[:lower:]])

Для обозначения маленьких букв используется специальная маска [:lower:] ozi@blog:~$ ls -l [[:lower:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt

8. Символы верхнего регистра

Для больших букв – [:upper:] ozi@blog:~$ ls -l [[:upper:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt

9. Только цифры (0 – 9)

Используя маску [:digit:] можно перечислить все цифры от 0 до 9.
ozi@blog:~$ ls -l [[:digit:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt

10. Символы, которые не относятся к числам или буквам

Разнообразные знаки пунктуации – [:punct:] ozi@blog:~$ ls -l [[:punct:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt

11. Буквы и цифры

Если нужные символы относятся к цифрам и буквам – можно использовать специальную маску [:alnum:] ozi@blog:~$ ls -l [[:alnum:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt

12. Пробел

Маска [:space:] эквивалентна символу пробела
ozi@blog:~$ ls *[[:space:]]*.txt ls: невозможно получить доступ к *[[:space:]]*.txt: Нет такого файла или каталога

Создадим файл, содержащий пробел
ozi@blog:~$ touch asd asd.txt

И проверим работу команды еще раз
ozi@blog:~$ls -l *[[:space:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 11:11 asd asd.txt

13. Оператор И

Объединить несколько команд можно с помощью оператора && (И). Если первая команда выполнится удачно, то запускается вторая.
ozi@blog:~$ ls -l && date -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar -rw-r--r-- 1 ozo ozo 0 июл 26 11:11 asd asd.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 bs -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 lq -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 tz Вт июл 26 11:12:58 MSK 2016
ozi@blog:~$ lss && date bash: lss: команда не найдена

Хотя это и не относиться к теме статьи, но использование оператора && удобно на практике и значительно экономит время

14. Оператор ИЛИ

В отличии от оператора &&, оператор || (ИЛИ) используется тогда, когда нужно выполнить другую команду в случае неудачного завершения первой
ozi@blog:~$ ls -l || date -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar -rw-r--r-- 1 ozo ozo 0 июл 26 11:11 asd asd.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 bs -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 lq -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 tz
ozi@blog:~$ lss || date bash: lss: команда не найдена Вт июл 26 11:14:45 MSK 2016

Заключение

В данной статье не были перечислены все возможные регулярные выражения (маски символов) и их способы применения, не была затронута тема объединения нескольких масок и многие другие. Но цель преследовалась другая – дать общие, простые, но полезные знания о работе в командной строке Linux.

Понравилась статья? Поделиться с друзьями:
IPCalc Blog